2016-02-10 2 views
1

У меня есть ниже log4j2.xml файла:проблемы log4j2 при отправке вывода в файл

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Properties> 
     <Property name="LOG_DIR">.</Property> 
     <Property name="ARCHIVE">output.log</Property> 
     <Property name="CONSOLE_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</Property> 
     <Property name="FILE_PATTERN">%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property> 
    </Properties> 
    <Appenders> 
     <Console name="console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="${CONSOLE_PATTERN}"/> 
     </Console> 
     <File name="file" fileName="${LOG_DIR}/${ARCHIVE}" immediateFlush="false" append="false"> 
      <PatternLayout pattern="${FILE_PATTERN}"/> 
     </File> 
    </Appenders> 
    <Loggers> 
     <Root level="info" additivity="false"> 
      <AppenderRef ref="console"/> 
      <AppenderRef ref="file"/> 
     </Root> 
     <Logger name="com.my.example" level="TRACE" additivity="false"> 
      <AppenderRef ref="console"/> 
     </Logger> 
    </Loggers> 
</Configuration> 

Затем в главном классе я поставил:

private static final Logger logger = LogManager.getLogger(Main.class.getName()); 

и в том же классе я вхожу несколько сообщений, используя строки ниже:

logger.trace("Starting application..."); 
    logger.info("This should be written to file, but doesn't"); 

Когда я отладка моего приложения:

  • Все сообщения о трассировке записываются на консоль.
  • Информационные сообщения (logger.info) записываются только в консоль, но не в файл. Файл создается, но если я его открываю, он пуст. Зачем?

Я не тестировал при выполнении приложения (без отладки). Мне интересно, нормально ли это и только успех при отладке.

ответ

1

Предположительно ваш основной класс находится в пакете com.my.example или подпакета. Поэтому он использует этот журнал для регистрации. Этот регистратор настроен только на консоль. Он имеет аддитивность, установленную на false, поэтому он не будет делегировать корневому регистратору. Если бы это правда, то корневой регистратор вошел бы в консоль во второй раз, а затем записывался в файл.

С вашей конфигурацией единственным способом регистрации файла является регистрация событий из регистратора, кроме одного, поступающего из пакета com.my.example. Например, если вы делаете

Logger logger2 = LogManager.getLogger ("Test"); logger2.info («Это будет записано в файл»);

он действительно перейдет к файлу.

См. http://logging.apache.org/log4j/2.x/manual/architecture.html, где все это обсуждается.

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