log4j как автоматически создавать новый файл журнала каждый день без архивирования старых

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

<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>

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


person Sturm    schedule 27.09.2016    source источник
comment
Используйте эту ссылку, она может вам помочь. "> stackoverflow.com/questions/20618527/   -  person mhasan    schedule 27.09.2016
comment
Спасибо @mhasan, но боюсь, что информация уже устарела. Насколько я могу судить, DailyRollingFileAppender не существует в последней версии log4j (в настоящее время 2.6). Кроме того, даже если это так, похоже, что он только добавляет дату к имени файла. Мне нужна возможность размещать различные части даты по всему пути к лог-файлу. например, 2016/09 - Sep/27 - Launcher.log   -  person Sturm    schedule 27.09.2016
comment
Хорошо, я возможно нашел обходной путь для этого. Надеюсь, я опубликую его в ближайшее время, но это зависит от версии 2.7 log4j. Оказывается, я столкнулся с ошибка, из-за которой архивирование срабатывает каждую секунду при обновлении основного файла журнала. Как только эта проблема будет решена, я опубликую свой обновленный файл log4j2.xml, чтобы все могли увидеть, как я это спланировал.   -  person Sturm    schedule 27.09.2016


Ответы (1)


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

Версия 2.7 была выпущена только сегодня (06.10.2016) и, среди прочего, устраняет эту проблему. Итак, 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>

Надеюсь, это поможет другим!

person Sturm    schedule 06.10.2016