Подтвердить что ты не робот

Как настроить log4j только для хранения файлов журнала за последние семь дней?

У меня есть следующая проблема с журналом с несколькими приложениями Java, использующими log4j для ведения журнала:

Я хочу, чтобы файлы журналов менялись ежедневно, например

log.2010-09-10
log.2010-09-09
log.2010-09-08
log.2010-09-07
log.2010-09-06
log.2010-09-05
log.2010-09-04

Но по соображениям безопасности данных нам не разрешено хранить файлы журналов дольше семи дней в моей компании. Поэтому генерация следующего следующего файла журнала log.2010-09-11 должна инициировать удаление log.2010-09-04. Можно ли настроить такое поведение с помощью log4j? Если нет, знаете ли вы еще одно изящное решение этой проблемы регистрации?

4b9b3361

Ответ 1

Вы можете выполнять свое домашнее хозяйство в отдельном script, который можно запускать ежедневно. Что-то вроде этого:

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;

Ответ 2

Я предполагаю, что вы используете RollingFileAppender? В этом случае у него есть свойство под названием MaxBackupIndex, которое вы можете установить для ограничения количества файлов. Например:

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Ответ 3

В соответствии со следующим сообщением вы не можете сделать это с помощью log4j: Использовать MaxBackupIndex в DailyRollingFileAppender -log4j

Насколько я знаю, эта функциональность должна была превратиться в log4j 2.0, но это усилие было упущено. Согласно сайту logback, logback является предполагаемым преемником log4j, поэтому вы можете использовать его.

Существует API под названием SLF4J, который предоставляет общий API для ведения журнала. Он будет загружать фактическую реализацию ведения журнала во время выполнения, поэтому в зависимости от конфигурации, которую вы предоставили, она может использовать java.util.log или log4j или logback или любую другую библиотеку, способную предоставлять средства ведения журнала. Будет немного вперед, чтобы перейти от использования log4j непосредственно к использованию SLF4J, но они предоставляют некоторые инструменты для автоматизации этого процесса. После того, как вы преобразуете свой код в SLF4J, переключение журналов на бэкэнд должно быть просто заменой файла конфигурации.

Ответ 4

log2j теперь имеет поддержку для удаления старых журналов. Посмотрите тег DefaultRolloverStrategy и снимок ниже. Он создает до 10 архивов в тот же день, будет анализировать каталог ${baseDir}, который вы определяете в теге Properties с максимальной глубиной 2 с именем файла журнала, соответствующим "app - *. Log.gz", и удалять журналы старше 7 дней, но сохраняйте последние 5 журналов, если ваши последние 5 журналов старше 7 дней.

  <DefaultRolloverStrategy max="10">
    <Delete basePath="${baseDir}" maxDepth="2">
      <IfFileName glob="*/app-*.log.gz">
        <IfLastModified age="7d">
          <IfAny>
            <IfAccumulatedFileCount exceeds="5" />
          </IfAny>
        </IfLastModified>
      </IfFileName>
    </Delete>
  </DefaultRolloverStrategy>

Ответ 5

Также есть DailyRollingFileAppender; http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html

Изменить: Прочитав это тревожное утверждение,

Наблюдается, что DailyRollingFileAppender демонстрирует синхронизацию проблемы и потери данных. Дополнительный компаньон log4j включает альтернативы которые следует учитывать для новых развертываний и которые обсуждаются в документации для org.apache.log4j.rolling.RollingFileAppender.

из приведенного выше URL (который я никогда не понимал ранее), тогда это выглядит как лучшая ставка; http://logging.apache.org/log4j/companions/extras/apidocs/index.html

Ответ 6

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

Загрузить: http://www.simonsite.org.uk/download.htm

Пример (groovy):

new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender',
   file: 'logs/app.log', datePattern: '.yyyy-MM-dd',
   maxRollFileCount: 7, compressionAlgorithm: 'GZ',
   compressionMinQueueSize: 2,
   layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n"))

Ответ 7

Существует еще один вариант DailyRollingFileAppender. но ему не хватает функции автоматического удаления (сохранить 7 дней), которую вы ищете

Пример

log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd

Мне что-то называет org.apache.log4j.CompositeRollingAppender, который сочетает в себе как функции RollingFileAppender (maxSizeRollBackups, № файла резервной копии), так и DailyRollingFileAppender (свертка по дням).

Но не пробовал это, кажется, не стандартная функция ветвления log4j 1.2.

Ответ 8

Если вы используете Linux, вы можете настроить задание cron с помощью tmpwatch.

В большинстве систем Linux есть задание cron tmpwatch, которое очищает каталог /tmp. Вы можете добавить еще один, который контролирует ваш каталог ведения журнала и удаляет файлы в течение 7 дней.

Если вы используете другую систему, возможно, есть эквивалентные утилиты.

Ответ 9

Используйте параметр log4j.appender.FILE.RollingPolicy.FileNamePattern, например. log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz для ведения журналов за месяц до перевертывания.

Я не ожидал проверки на один месяц, но я попытался с помощью mm (то есть минут) и подтвердил, что он перезаписывается, поэтому я предполагаю, что он будет работать для всех шаблонов.

Ответ 10

В классе DailyRollingFileAppender используется параметр DatePattern, чтобы указать скользящий график. Этот шаблон должен соответствовать соглашениям SimpleDateFormat от Std. Издание v1.4.2. Таким образом, мы должны использовать опцию E (День недели). Например:

<param name="DatePattern" value="'.'EEE"/>

Подробнее о DailyRollingFileAppender классе от log4j javadoc здесь. К сожалению, документация по Java 1.4.2 больше не в сети, но вы можете скачать копию здесь.

Ответ 11

Я установил:

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.DatePattern='.'yyyy-MM-dd
# Archive log files (Keep one year of daily files)
log4j.appender.R.MaxBackupIndex=367

Как и другие передо мной, опция DEBUG показала мне ошибку:

log4j: WARN Нет такого свойства [maxBackupIndex] в org.apache.log4j.DailyRollingFileAppender.

Вот идея, которую я еще не пробовал, предположим, что я устанавливаю DatePattern таким образом, чтобы файлы перезаписывали друг друга после необходимого периода времени. Чтобы сохранить год, я мог бы попробовать установить:

log4j.appender.R.DatePattern='.'MM-dd

Будет ли это работать или это приведет к ошибке? Например, вам понадобится год, чтобы узнать, я мог бы попробовать:

log4j.appender.R.DatePattern='.'dd

но все равно потребуется месяц, чтобы узнать.

Ответ 12

Несмотря на запуск задания chrone, для задачи мы можем использовать файл log4j2.properties в папке config logstash. Посмотрите на приведенную ниже ссылку, это будет полезно.

https://github.com/elastic/logstash/issues/7482

Ответ 13

Я создаю этот метод и вызываю его, закрывая приложение:

  public void deleteFiles(){

    File f = new File("log");
    File[] fileArray = f.listFiles();
    double timenow = System.currentTimeMillis();

    double olderTenDays = timenow - 864000000;// MS for ten days

    for (int i = 0; i < fileArray.length; i++) {

        if(fileArray[i].lastModified()< olderTenDays )
           fileArray[i].delete();
    }
 }