2012-01-25 2 views
0

У меня есть setup log4j с tomcat6 в Windows 2008. Операторы записываются в файл журнала, но System.out звонки не регистрируются.Log4j не пишет System.out в файл

Когда я запустил tomcat6.exe из командной строки, в приглашении отображаются вызовы System.out, но то же самое не регистрируется в файле журнала.

Я определил ConsoleAppender и Filelogger следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true" threshold="debug"> 
     <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.SimpleLayout"> 
    </layout> 
     </appender> 

     <appender name="CATALINA" class="org.apache.log4j.appender.TimeAndSizeRollingAppender"> 
     <param name="File" value="${catalina.home}/logs/catalina.log"/> 
       <param name="Threshold" value="DEBUG"/> 
     <param name="Append" value="true"/> 
     <param name="ImmediateFlush" value="true"/> 
     <param name="DatePattern" value=".yyyy-MM-dd"/> 
     <param name="MaxFileSize" value="100MB"/> 
     <param name="MaxRollFileCount" value="100"/> 
     <param name="ScavengeInterval" value="30000"/> 
     <param name="BufferedIO" value="false"/> 
     <param name="CompressionAlgorithm" value="ZIP"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{MMM dd, yyyy HH:mm:ss a} %c%n \r%p: %m%n"/> 
    </layout> 
    </appender> 

<logger name="org.apache" additivity="false"> 
    <level value="INFO"/> 
    <appender-ref ref="CATALINA" /> 
</logger> 

    <root> 
      <priority value="INFO"/> 
    <appender-ref ref="CONSOLE"/> 
    </root> 

+0

СОП = System.out.print –

ответ

1

В вашей выше конфигурации log4j вы создаете ConsoleAppender, который регистрирует все ваши сообщения на стандартный вывод. Это то же место, что и вызовы System.out.println(). Теперь, когда вы создали 2-й Appender (FileAppender), вы больше не пишете стандартную версию, а теперь записываете в файл.

Я хотел бы предложить изменить свой System.out.println() вызывает использование Log4j вызовов [Error(), информация(), отладки() и т.д ..]

public class MyClass{ 
private static Logger logger = Logger.getLogger(MyClass.class); 

public MyClass(){ 
    logger.debug("Hello World"); 
} 
} 

Делая это, вы не будете смешивая и сопоставляя ваш log4j с вашими стандартными исходящими вызовами, а затем можете настроить ваше приложение по мере необходимости между консолью и записью файла. Хорошая польза от использования Logger над вызовами System.out заключается в том, что они настраиваются во время выполнения и могут регистрировать сообщения на разных уровнях.

Редактировать согласно комментариям

Tomcat по умолчанию бревен стандартного вывода сообщения на %tomcat_home%/logs/catalina.out (название могут несколько отличаться в зависимости от спецификации TOMCAT) Tomcat использует рамки ведения журнала под названием JULI для выполняют свои основные лесозаготовок. Если вы просто хотите, чтобы журнал был написан где-то в другом месте, а затем в папке tomcat, вы можете это сделать, отредактировав файл % tomcat_home/conf/logging.properties

Другой сценарий, который вы, возможно, захотите решить, полностью перенаправляет stdout. Это неодобрительно, но может быть сделано. Если вы посмотрите файл catalina.bat (или .sh в unix), вы увидите параметр запуска LOGGING_MANAGER, который переопределит реализацию JULI по умолчанию. Я никогда не использовал этот вариант, поэтому вам нужно исследовать его более подробно. Чтобы понять JULI подробнее читайте Apache's Wiki article

+0

Спасибо за подробный ответ Шон. Фактически вывод, который я хочу записать, появляется рядом с информацией о log4j на консоли: log4j: reset attribute = "false". log4j: Threshold = "debug". log4j: Возврат экземпляра org.apache.log4j.Logger. log4j: настройка [org.apache] аддитивности на [false]. log4j: Значение уровня для org.apache - [INFO]. Было бы здорово, если бы я мог направлять этот регистратор в файл журнала. Спасибо –

+0

, так это сообщения инициализации log4j, которые вы ищете для регистрации? – Sean

+0

, если это стандартное сообщение, которое вы хотите, по умолчанию они должны быть зарегистрированы в разделе% tomcat%/logs/catalina.out, в противном случае вам нужно посмотреть перенаправление stdout. tomcat по умолчанию регистрирует стандарт для вышеупомянутого файла – Sean

1

This page дает подсказку о том, как это сделать, но это немного загадочно. Короче говоря:

  • Открыть файл context.xml для конфигурации tomcat. Для меня, развивается внутри Eclipse, это в моем Затмения Workspace под

\ Workspace \ Project \ Servers \ имя-сервера конфигурации \ config.xml

Там также глобальная версия кот под, что стоит сделать

\ tomcat \ conf \ context.XML

  • Добавить swallowOutput = "истина" в контексте, как показано ниже

    <context swallowOutput="true"> 
    
  • (опционально я думаю) Настройка протоколирования приложений. Я использовал LogBack в своем приложении, но я не уверен, что это актуально, поскольку это проходит через внутреннее ведение журнала Tomcat, а не ваше ведение журнала приложений.

  • В моем свойстве tomcat.logging у меня есть следующие строки конфигурации журнала. Эти строки определяют файл журнала, мои System.out заявления идти, хотя другие люди сказали, что это идет в их файл catalina.out

    2localhost.org.apache.juli.FileHandler.level = FINE 
    2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 
    2localhost.org.apache.juli.FileHandler.prefix = localhost. 
    
  • Теперь, когда вы делаете System.out.println он должен появиться в ваш localhost.log файл, как это делает для меня, хотя, как я сказал, что некоторые люди говорят, что идет в catalina.log

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