logrotate: удалить журналы tomcat/jboss старше n дней

Я не нашел решения для очистки старых журналов tomcat или jboss или любых других журналов с отметками времени: catalog.log./server.log.. В основном эти журналы ротируются jboss как: server.log, server.log.20131201, server.log.20131203 и так далее.

Есть ли способ использовать logrotate для удаления журналов старше n дней? Я не хочу использовать find внутри postrotate или настраивать свойства ведения журнала jboss/tomcat. Я просто хочу знать, может ли logrotate добиться этого самостоятельно. Я знаю, что это не очень продуктивно, но я столкнулся с проблемой, на которую мне нужен ответ.


person dOps    schedule 09.01.2014    source источник
comment
Этот ответ может быть полезен: stackoverflow.com/questions/2772021/   -  person akhikhl    schedule 09.01.2014
comment
Эй, я знаю, как настроить ведение журнала tomcat, чтобы управлять журналами с помощью cron. Я использовал tomcat как пример. Вопрос, который у меня есть, заключается в том, может ли logrotate самостоятельно позаботиться об удалении старых файлов с отметками времени.   -  person dOps    schedule 09.01.2014
comment
Согласно упомянутому ответу: нет   -  person akhikhl    schedule 09.01.2014
comment
Ответ, который вы предоставили, не говорит о unix logrotate, поэтому не уверен, как вы это сделали. Этот ответ говорит о собственной ротации журналов tomcat.   -  person dOps    schedule 09.01.2014


Ответы (4)


Если вы не хотите использовать find внутри postrotate, нет, вы не можете.

logrotate рассматривает каждый экземпляр server.log, вращаемый Tomcat/JBoss, как отдельный файл, и, поскольку они уникальны, logrotate будет вращать их только один раз. maxage — директива, которая удаляет ротированные журналы старше n дней — проверяется только в том случае, если файл журнала должен быть ротирован, так что maxage выполняется только один раз и не может отслеживать возраст файла.

Однако, если вы передумаете использовать find, logrotate может помочь вам упростить управление файлами журналов, созданными Tomcat и JBoss. Я использую его для сжатия и удаления старых файлов с помощью такого файла конфигурации:

/path/to/logs/server.log.????-??-?? {
    compress
    compresscmd /usr/bin/bzip2
    nocreate
    nodateext
    ifempty
    missingok
    rotate 1
    size 0
    start 0
    lastaction
        # Remove rotated files older than 180 days
        find /path/to/logs -name 'server.log.????-??-??.0.bz2' -mtime +180 -exec rm {} \;
    endscript
}

где:

  • rotate 1 и compress переименовать и сжать, скажем, server.log.20131201 в server.log.20131201.0.bz2. 0 между отметкой времени и расширением .bz2 происходит от start 0.
  • size 0 гарантирует, что файлы всегда переименовываются и сжимаются.
  • Блок lastaction удаляет ротированные файлы старше 180 дней.
person jaume    schedule 09.03.2015
comment
Это такой отличный ответ. Мне потребовалось некоторое время, чтобы найти его, но он должен быть в верхней части моих результатов поиска! Я столкнулся с проблемой со строкой, начинающейся с su. Я удалил его из своей конфигурации, и это, похоже, не вызвало проблем. - person Philippe; 05.02.2016
comment
@Philippe Филипп, я рад, что вы нашли мой ответ полезным, было немало проб и ошибок, пока я не нашел удовлетворительную конфигурацию. Ключевое слово su полезно только в том случае, если, как в моем случае, вы хотите, чтобы файлы журналов принадлежали пользователю/группе, которые запускают приложение. Это сбивает с толку, и я удалил его из ответа. И спасибо за исправление missingok. - person jaume; 05.02.2016
comment
что означает -mtime +180? - person Ryan Lyu; 28.04.2020
comment
@RyanLv -mtime +180 означает, что время модификации прошло более 180 дней. find будет сопоставлять файлы с именем, указанным в опции -name, старше 180 дней. Обратите внимание, что UNIX-подобные файловые системы (включая macOS и Linux) традиционно имеют два различных эталонных времени при работе с изменениями в файлах: время изменения, которое устанавливается каждый раз, когда появляется информация о состоянии файла, или, точнее, , информацию об индексном узле, изменения и время модификации, которое устанавливается при изменении содержимого файла. См. unix.stackexchange.com/a/132661 для получения дополнительной информации. - person jaume; 28.04.2020

logrotate может управлять вашими журналами, чередуя их и, в конечном итоге, сохраняя ограниченное количество ротированных журналов. Но, насколько я знаю, он может сделать это только для журналов, которыми он управляет напрямую. Если ваши журналы уже вращаются каким-то другим агентом (например, самим Tomcat), logrotate ничего не может сделать, просто потому, что ничего не знает о ротации, выполняемой кем-то другим.

Итак, ответ - нет, вы не можете использовать logrotate для удаления журналов, которые не управляются им самим (и я думаю, что он даже не предназначен для чего-то подобного).

person Alessio Gaeta    schedule 04.12.2014

Вы можете поместить скрипт в /etc/cron.daily. Например:

кот /etc/cron.daily/tomcat-rotate-logs

#!/bin/sh

# erasing tomcat logs older then 7 days

for x in $(find /var/log/tomcat/ -type f -mtime +7);
do
       rm "$x";
       logger -t TOMCAT-ROTATE-LOGS "Erasing $x [done]"; 
done

или создайте конфигурацию logrotate. Например: кошка /etc/logrotate.d/tomcat

/var/log/tomcat/*.log {
        su tomcat tomcat
        copytruncate  
        daily  
        rotate 6  
        compress  
        missingok
}

«su tomcat tomcat» — означает предотвращение ошибки logrotate при неправильных разрешениях.

person shcherbak    schedule 19.11.2015

Не уверен, что конфигурация @jaume будет корректно вести себя с файлом журнала, который записывается прямо сейчас. Особенно с параметром nocreate. Хотелось бы увидеть его комментарий по этому поводу. Как по мне, было бы проще отказаться от logrotate и использовать только bash-скрипт в cron. Что-то вроде этого:

#!/bin/bash
/usr/bin/find /path/to/logs/ -name 'server.log.????-??-??.gz' -mtime +7 -delete
/usr/bin/find /path/to/logs/ -name 'server.log.????-??-??' -mtime +1 -exec gzip -q {} \;
person ilya.v    schedule 30.11.2020