2016-10-07 3 views
0

Log4j2 RollingFile appenders сталкиваясьLog4j2 RollingFile appenders сталкивающегося

Ниже упрощенной версия отладки нашего файла конфигурации log4j2 (Мы опрокидывание каждой ночи не каждая минуты!).
Эта конфигурация вместо того, чтобы создавать файл опрокидывания каждую минуту
(в соответствии с theTimeBasedTriggeringPolicy) создаст один файл опрокидывания (non-tarred), содержащий форматированное журналирование JSON, которое будет перезаписано каждые 20 КБ
(хотя это будет немного . больше, чем 20KB (See Screenshot)
мы также получаем следующие ошибки (сокращенные с «...»): -

2016-10-07 08:47:34,433 default-workqueue-4 ERROR Unable to copy file /.../logs/logFile-2016-10-07-08:47:11.log to /.../logs/logFile-2016-10-07-08:47:11.log: java.nio.file.NoSuchFileException /.../logs/logFile-2016-10-07-08:47:11.log 

Если переключить порядок Appender timeBasedRollingFileJsonLayout и sizeBasedRollingFilePatternLayoutWithZippedArchive Appender тогда не опрокидывание не происходит в все.

Если w e удалите файл sizeBasedRollingFilePatternLayoutWithZippedArchive, тогда приложение timeBasedRollingFileJsonLayout работает как ожидалось.

У нас есть два разных приложения для разных сред, где журналы могут быть подключены или не подключены к ELK.
В нашем реальном файле конфигурации log4j2 мы используем свойства для выбора соответствующего приложения для среды.
Я удалил свойства из этого файла для ясности и исключил их как возможную причину проблемы.

Мы используем log4j 2.6.2.

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg %n" /> 
     </Console> 
     <RollingFile name="timeBasedRollingFileJsonLayout" append="true" fileName="logs/logFile.log" filePattern="logs/logFile-%d{yyyy-MM-dd-HH:mm}.log"> 
      <JSONLayout properties="true" compact="true" eventEol="true" /> 
      <Policies> 
       <TimeBasedTriggeringPolicy /> 
      </Policies> 
     </RollingFile> 
     <RollingFile name="sizeBasedRollingFilePatternLayoutWithZippedArchive" append="true" fileName="logs/logFile.log" filePattern="logs/logFile-%d{yyyy-MM-dd}-%i.log.gz"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg %n" /> 
      <Policies> 
       <SizeBasedTriggeringPolicy size="20KB" /> 
      </Policies> 
     </RollingFile> 
    </Appenders> 
    <Loggers> 
     <logger name="logger.one" level="info" additivity="false"> 
      <AppenderRef ref="timeBasedRollingFileJsonLayout" /> 
     </logger> 
     <Logger name="logger.two" level="info" additivity="false"> 
      <AppenderRef ref="timeBasedRollingFileJsonLayout" /> 
     </Logger> 
     <Logger name="logger.three" level="info" additivity="false"> 
      <AppenderRef ref="timeBasedRollingFileJsonLayout" /> 
     </Logger> 
     <Root level="info"> 
      <AppenderRef ref="timeBasedRollingFileJsonLayout" level="all" /> 
     </Root> 
    </Loggers> 
</Configuration> 

ответ

1

Я затрудняюсь понять, почему вы думаете, что это должно сработать. У вас есть два приложения, которые пытаются записать в тот же файл, который пытается опрокинуться на основе разных критериев и опрокинуться на файлы с разными именами. Неудивительно, что вы получаете файл, который использует ошибку, так как две вещи открываются сразу.

+0

Hi @rgoers. Я думал, что, поскольку регистраторы ссылаются только на одно приложение, он будет активен только этим приложением. Из того, что вы сказали, я правильно понял, что AppenderRef предназначен только для того, чтобы направлять Logger на конкретный appender и что все приставки активны независимо от того, ссылаются ли они на Logger или нет? Если это так, то использование RoutingAppender может быть тем, что мне нужно? –

+0

Да, если вам нужно динамическое создание Appender, то RoutingAppender сделает это. Log4j2 2.7 просто добавил ScriptAppenderSelector, который может быть более уместным для ваших нужд. – rgoers

+0

Спасибо @rgoers. Это похоже на то, что мне нужно. –

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