Использовать системные свойства ИЛИ переменные в 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
?
Есть ли другой способ сделать это?
Ответы
Ответ 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
Примечание: Я не уверен, что там работает точка .
, поэтому заменил ее на символ подчеркивания _
.