Ответ 1
Вы можете выполнять свое домашнее хозяйство в отдельном script, который можно запускать ежедневно. Что-то вроде этого:
find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
У меня есть следующая проблема с журналом с несколькими приложениями 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
? Если нет, знаете ли вы еще одно изящное решение этой проблемы регистрации?
Вы можете выполнять свое домашнее хозяйство в отдельном script, который можно запускать ежедневно. Что-то вроде этого:
find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
Я предполагаю, что вы используете 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
В соответствии со следующим сообщением вы не можете сделать это с помощью log4j: Использовать MaxBackupIndex в DailyRollingFileAppender -log4j
Насколько я знаю, эта функциональность должна была превратиться в log4j 2.0, но это усилие было упущено. Согласно сайту logback, logback является предполагаемым преемником log4j, поэтому вы можете использовать его.
Существует API под названием SLF4J, который предоставляет общий API для ведения журнала. Он будет загружать фактическую реализацию ведения журнала во время выполнения, поэтому в зависимости от конфигурации, которую вы предоставили, она может использовать java.util.log или log4j или logback или любую другую библиотеку, способную предоставлять средства ведения журнала. Будет немного вперед, чтобы перейти от использования log4j непосредственно к использованию SLF4J, но они предоставляют некоторые инструменты для автоматизации этого процесса. После того, как вы преобразуете свой код в SLF4J, переключение журналов на бэкэнд должно быть просто заменой файла конфигурации.
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>
Также есть 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
Я наткнулся на этот 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"))
Существует еще один вариант 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.
Если вы используете Linux, вы можете настроить задание cron с помощью tmpwatch.
В большинстве систем Linux есть задание cron tmpwatch, которое очищает каталог /tmp. Вы можете добавить еще один, который контролирует ваш каталог ведения журнала и удаляет файлы в течение 7 дней.
Если вы используете другую систему, возможно, есть эквивалентные утилиты.
Используйте параметр log4j.appender.FILE.RollingPolicy.FileNamePattern
, например. log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz
для ведения журналов за месяц до перевертывания.
Я не ожидал проверки на один месяц, но я попытался с помощью mm (то есть минут) и подтвердил, что он перезаписывается, поэтому я предполагаю, что он будет работать для всех шаблонов.
В классе DailyRollingFileAppender
используется параметр DatePattern, чтобы указать скользящий график. Этот шаблон должен соответствовать соглашениям SimpleDateFormat
от Std. Издание v1.4.2. Таким образом, мы должны использовать опцию E
(День недели). Например:
<param name="DatePattern" value="'.'EEE"/>
Подробнее о DailyRollingFileAppender
классе от log4j
javadoc здесь. К сожалению, документация по Java 1.4.2 больше не в сети, но вы можете скачать копию здесь.
Я установил:
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
но все равно потребуется месяц, чтобы узнать.
Несмотря на запуск задания chrone, для задачи мы можем использовать файл log4j2.properties в папке config logstash. Посмотрите на приведенную ниже ссылку, это будет полезно.
Я создаю этот метод и вызываю его, закрывая приложение:
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();
}
}