2013-12-03 2 views
7

Я потратил пару часов, пытаясь понять это, и я полностью потерял его. Я считаю, что новый процесс конфигурации излишне сложный.Как настроить Log4J2

У меня есть сервлет с web.xml файл со следующим:

<context-param> 
    <param-name>log4jConfiguration</param-name> 
    <param-value>file:///etc/myApp/log4j2.xml</param-value> 
</context-param> 

Это, кажется, не имеют никакого эффекта. Я использую Tomcat 7.0.42, и я удалил все ссылки на log4j * .jar в файле catalina.properties. Журналы в моем приложении все еще отправляются, но они просто отправляются в System.out без какого-либо форматирования, который я указал.

Итак, я попытался просто сделать это вручную на мой собственный:

InputStream in = 
    new FileInputStream(new File("/etc/myApp/log4j2.xml")); 
ConfigurationSource source = new ConfigurationSource(in); 
ConfigurationFactory factory = new XMLConfigurationFactory(); 
Configuration configuration = factory.getConfiguration(source); 
LoggerContext context = (LoggerContext) LogManager.getContext(); 
context.start(configuration); 
context.updateLoggers(); 

Logger.getLogger("Test").log(Level.INFO, "This is a logging message."); 

Во-первых, это, кажется, совершенно запутанным. Ясно, что существует некоторый код, который будет искать разные файлы и предполагать типы файлов на основе их расширений через свойство log4jConfiguration, так почему же нет LogManger.reconfigure(String), который имеет тот же эффект?

Во-вторых, это также не имеет никакого эффекта. Опять же, журнал печатается на System.out, и ни одно из запрошенных форматирования не выполняется.

Вот содержание моего log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="DEBUG"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 

    <File name="LogFile" fileName="/var/log/myApp/myApp.log"> 
     <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c{1.} [%t] %m%n"/> 
    </File> 
    </Appenders> 
    <Loggers> 
    <Root level="DEBUG"> 
     <AppenderRef ref="Console" level="DEBUG"/> 
     <AppenderRef ref="LogFile" level="DEBUG"/> 
    </Root> 
    </Loggers> 
</Configuration> 

Выход в обоих случаях выходит что-то вроде:

Dec 03, 2013 6:06:45 PM test.Test main 
INFO: This is a logging message. 

Заранее спасибо,

Джон

EDIT: Это действительно работает. Похоже, что я отсутствовал, «log4j-jcl-2.0-beta9.jar». Ответ Ремко Попмы также работает, если «контекст-парам» выше не работает.

ответ

2

Существует много возможных сценариев с журналом webapp, что делает конфигурацию более сложной, чем идеал. Помещение баннеров log4j2 и файла конфигурации в путь к классу webapp должно работать. Вы видели страницу руководства для использования log4j2 в веб-приложениях? Если проблема осталась, подайте файл log4j2 jira.

+0

Очевидно, что и путь к классам, и контекстный параметр работают в том, что он читается. Я знаю это, потому что, когда развертывается веб-приложение, Tomcat сбрасывает материал Log4J DEBUG в журналы, в том формате, который я хочу. Если я изменю 'status' на' WARN', он не сбрасывает данные в журналы при развертывании приложения. Тем не менее, журналы моего приложения (записанные в общедоступных журналах) по-прежнему не отформатированы, как я хочу, или записываются во внешний файл. У меня есть «commons-logging-api» (а не «commons-logging»), «log4j-api» и «log4j-core» JAR. У меня нет «log4j-commons-impl»; Я даже не вижу его в «log4j-beta9.tar.gz» – jojenki

+0

. Пожалуйста, зайдите на страницу часто задаваемых вопросов log4j2. Он должен помочь вам определить, какие мостовые банки нужно добавить, чтобы вызовы, связанные с голосованием, пересылались в реализацию log4j2. –

+0

Спасибо! Теперь я чувствую себя немного немой. Он работает наполовину (он работает для журналов Spring, но не для меня). Я буду играть с ним больше, но я думаю, что вы решили большинство моих вопросов. – jojenki

0

LoggerContext уже имеет способ setConfigLocation, который принимает в качестве параметра URI. Это меня озадачивает, почему нет подобного метода, который принимает параметр InputStream. Вместо этого нам приходится иметь дело с самым запутанным и грязным способом загрузки нашего log4j2.xml, который не находится в пути к классам.

+0

Ну, это с открытым исходным кодом.Если вы так сильно об этом думаете, ничто не мешает вам предоставить запрос на патч или тяну (с тестами), который улучшает ситуацию. –

Смежные вопросы