Log4j не записывает System.out в файл - PullRequest
0 голосов
/ 25 января 2012

У меня настроен log4j с tomcat6 в Windows 2008. Операторы записываются в файл журнала, но 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>

Ответы [ 2 ]

1 голос
/ 20 июля 2012

Эта страница дает подсказку о том, как это сделать, но она немного загадочна.Вкратце:

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

\ Workspace \ Project \ Servers \ Server-name-config \ config.xml

Существует также глобальная версия tomcat, под которой стоит попробовать

\ tomcat \ conf \ context.xml

  • Add swallowOutput = "true "для контекста, как показано ниже

    <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.
    
  • Теперь, когда вы делаете Систему.out.println он должен появиться в вашем файле localhost.log так же, как и для меня, хотя, как я уже сказал, некоторые люди говорили, что это входит в catalina.log

1 голос
/ 26 января 2012

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

Я бы предложил изменить вызовы system.out.println () для использования Log4j вызовов [error (), info (), debug () и т. Д.]

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

...