2016-09-27 5 views
0

У нас есть специальная схема ведения журнала, где я работаю. Поскольку нужно регистрировать несколько программ, мы будем сортировать их по дате, а не по имени файла. Так, например, файл журнала, созданный нашей программой сценарий запуска на 27 сентября 2016 года на компьютере под названием «Воин» будет располагаться таким образом:log4j как автоматически создать новый файл журнала каждый день без архивирования старых

<root folder>/logs/warrior/2016/09 - Sep/27 - Launcher.log 

Это делает для нахождения правильного файла журнала для конкретного компьютер очень организован, но также очень быстрый. Если некоторые из этой схемы ведения журнала необходимо изменить, у меня есть немного места для маневра, чтобы это сделать. Если возможно, я бы хотел сохранить это как есть.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из наших пользователей поддерживают программу в течение ночи. На следующий день вся информация о регистрации появляется в файле журнала предыдущего дня. Есть ли способ, чтобы log4j (в настоящее время версия 2.6) автоматически обнаруживает, что произошел новый день, и измените файл ведения журнала на 28 - Launcher.log, сохранив ту же схему, что и выше? Также, чтобы он автоматически создавал папку 10 - Oct/, когда в следующий раз попадает и т. Д.?

Мне не нужен log4j, чтобы архивировать что угодно, так как файлы журнала всегда будут перескакивать каждый день, поэтому мне действительно не нужна политика триггера (за исключением, возможно, основанной на размерах, на всякий случай файла становится действительно огромным) на RollingFileAppender. Вот то, что я до сих пор в файле log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN" monitorInterval="30"> 
    <Properties> 
    <Property name="filename">logs/artdept.log</Property> 
    <Property name="baseDir">/Volumes/ArtDept/ArtDept/Scripts/sky-artdept/logs</Property> 
    </Properties> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <File name="MyFile" fileName="${filename}"> 
     <PatternLayout> 
     <pattern>%d %p %C{1.} [%t] %m%n</pattern> 
     </PatternLayout> 
    </File> 
    <RollingFile name="RollFile" fileName="${baseDir}/${env:USER}/${date:yyyy}/${date:MM} - ${date:MMM}/${date:dd} - Launcher.log" 
      filePattern="${baseDir}/Archives/${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> 
     <PatternLayout> 
     <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> 
     </PatternLayout> 
     <Policies> 
     <SizeBasedTriggeringPolicy size="250 MB" /> 
     </Policies> 
    </RollingFile> 
    </Appenders> 
    <Loggers> 
    <Root level="trace"> 
     <AppenderRef ref="RollFile"/> 
    </Root> 
    </Loggers> 
</Configuration> 

Я уверен, что я что-то простое, чтобы заставить его изменить файлы в полночь не хватает, но я не могу понять, что это такое.

+0

Используйте эту ссылку, это может вам помочь ..http: //stackoverflow.com/questions/20618527/create-new-log-file-daily-using-log4j – mhasan

+0

Спасибо @mhasan, но я боюсь, что информация там теперь устарела. Насколько я могу судить, 'DailyRollingFileAppender' не существует в последней версии log4j (в настоящее время 2.6). Кроме того, даже если это так, похоже, что он добавляет дату только к имени файла. Мне нужна возможность поместить различные части даты на весь путь в файл журнала. например, '2016/09 - сентябрь/27 - Launcher.log' – Sturm

+0

Хорошо, я * мог * обнаружить обходной путь для этого. Я буду публиковать его в ближайшее время, надеюсь, но это зависит от версии log4j версии 2.7. Оказывается, я столкнулся с [ошибкой] (https://issues.apache.org/jira/browse/LOG4J2-1548?jql=project%20%3D%20LOG4J2%20AND%20text%20~%20cron), которая вызывает архивирование, чтобы запускать каждую секунду, когда есть обновление основного файла журнала. Как только эта проблема будет решена, я опубликую обновленный файл log4j2.xml, чтобы все могли видеть, как я это планировал. – Sturm

ответ

0

Таким образом, получается, что использование CronTriggeringPolicy - это то, что необходимо, наряду с установкой его атрибута на "0 0 0 * * ?". Это показано в нескольких примерах в документации log4j, но оно было нарушено в версии 2.6.2. Несмотря на то, что эта политика настроена на то, чтобы один раз в день в полночь был загружен файл журнала, он постоянно перевертывал его - один раз в секунду после первого запуска!

Версия 2.7 была выпущена сегодня (10/06/2016) и, среди многих других, устраняет эту проблему. Итак, yay, CronTriggeringPolicy работает как ожидалось сейчас! Теперь новая проблема вызвала уродливую голову, но я опубликую об этом завтра в отдельном потоке, когда проведу еще немного.

А вот файл конфигурации log4j2.xml Я использую:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN" monitorInterval="30"> 
    <Properties> 
    <Property name="filename">logs/artdept.log</Property> 
    <Property name="baseDir">/Volumes/ArtDept/ArtDept/Scripts/sky-artdept/logs</Property> 
    </Properties> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <File name="MyFile" fileName="${filename}"> 
     <PatternLayout> 
     <pattern>%d %p %C{1.} [%t] %m%n</pattern> 
     </PatternLayout> 
    </File> 
    <RollingFile name="DailyRoll" fileName="${baseDir}/${env:USER}/${date:yyyy}/${date:MM} - ${date:MMM}/Launcher.log" 
      filePattern="${baseDir}/${env:USER}/${date:yyyy}/${date:MM} - ${date:MMM}/%d{dd} - Launcher-%i.log"> 
     <PatternLayout> 
     <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> 
     </PatternLayout> 
     <Policies> 
     <CronTriggeringPolicy schedule="0 0 0 * * ?" /> 
     <SizeBasedTriggeringPolicy size="250 MB" /> 
     </Policies> 
    </RollingFile> 
    </Appenders> 
    <Loggers> 
    <Root level="trace"> 
     <AppenderRef ref="DailyRoll"/> 
    </Root> 
    </Loggers> 
</Configuration> 

Я надеюсь, что это помогает из других!

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

  • Нет связанных вопросов^_^