Подтвердить что ты не робот

Использовать системные свойства ИЛИ переменные в log4j

Я хочу сделать вот так:

<appender name="ErrorLog" class="org.apache.log4j.FileAppender">
        <param name="File" value="${error.log.path}"/>
        <param name="Append" value="true" />
        <param name="Threshold" value="ERROR"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%C{1} %L [%t] %d{dd MMM,yyyy HH:mm:ss.SSS} %-5p - %m%n" />
        </layout>
    </appender>

Обратите внимание на эту строку: <param name="File" value="${error.log.path}"/>

Я попытался установить такие значения:

public static void main(String[] args) {
     System.setProperty("error.log.path", "/test/crm/log/error.log");
     ApplicationContext context = new ClassPathXmlApplicationContext("blah.xml");
     ..........
     .......... 
  }

Но я не вижу никакого эффекта.

Установлен ли log4j перед вызовом метода main?

Есть ли другой способ сделать это?

4b9b3361

Ответ 1

Посмотрите этот поток

Похоже, вы все сделали правильно. Я не думаю, что существует какая-либо разница между установкой свойства внутри вашего основного класса с помощью System.setProperty() и указанием его через командную строку, если это происходит до фактической инициализации log4j.

Я думаю, ваша проблема в том, что ваша структура ведения журнала загружается, прежде чем указывать свойство. Я могу сказать, что структура ведения журнала (log4j) будет настроена при вызове конфигуратора. Stuff как BasicConfigurator.configure() (в вашем случае его xml-конфигуратор).

В противном случае первая попытка использования журнала приведет к сообщению типа "log4j неправильно настроен".

Реальный вопрос: не упрощен ли ваш фрагмент кода с "основным".

С учетом этого, еще один вопрос, который я должен задать - используете ли вы в каком-то контейнере или используете настоящий ванильный метод main и настраиваете все самостоятельно? Я спрашиваю, потому что, если вы работаете в контейнере, есть вероятность, что контейнер сам по себе каким-то образом сконфигурирует его ведение журнала, например JBoss сделает это. В этом случае требуется больше исследований.

Надеюсь, что это поможет

Ответ 2

Вы можете сделать это, настроив appender прагматично

  FileAppender fa = new FileAppender();
  fa.setFile("/test/crm/log/error.log");
  fa.setLayout(new 
   PatternLayout("%C{1} %L [%t] %d{dd MMM,yyyy HH:mm:ss.SSS} %-5p - %m%n"));
  fa.setThreshold(Level.ERROR);
  fa.setAppend(true);
  fa.activateOptions();
  Logger.getRootLogger().addAppender(fa);
  // similarly you can add all appenders.

 // or just append file name alone 
 Logger log = Logger.getLogger(YourClass.class);
 FileAppender appender = (FileAppender) log.getAppender("ErrorLog");
 appender.setFile("appender");

Ответ 3

Свойства системы можно использовать как ${user.home}, выберите требуемый здесь http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

пример:

<appender name="errorLog" class="com.qait.logger.IOPFileAppender">
    <param name="Threshold" value="ERROR" />
    <param name="File"
        value="${user.home}/Harvestors/IOP Error Logs/error.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d%-5p  [%c{1}] %m %n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="ERROR" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>

Ответ 4

Настройка системного свойства здесь не затрагивает. Вам нужно передать его как аргумент java во время выполнения. Попробуйте

 java -Derror_log_path=/test/crm/log/error.log

Примечание: Я не уверен, что там работает точка ., поэтому заменил ее на символ подчеркивания _.