Могу ли я использовать logrotate для сжатия ежедневных (с указанием даты) журналов?

8

У меня есть журналы в следующем формате: ГГГГММДД

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

Могу ли я сделать это в logrotate или мне нужно использовать собственный скрипт в cron?

Шимон Тот
источник

Ответы:

4

Вот быстрый скрипт, который будет делать то, что вам нужно:

#!/bin/bash
LOGDIR=/var/log/somedir
OLDLOGS=/var/log/keep-old-logs-here
PATH=/bin:$PATH
TODAY=$(date +'%Y%m%d')

[ -d $OLDLOGS ] || mkdir -p $OLDLOGS

cd $LOGDIR

for LOG in $(ls | egrep '^[[:digit:]]{8}$'); do
    [ $LOG -lt $TODAY ] && gzip $LOG && mv $LOG.gz 
done

Сделайте скрипт исполняемым:

$ chmod +x /where/you/put/this/script

Запись в crontab будет выглядеть так:

30 0 * * * /where/you/put/this/script

Просто настройте LOGDIRи OLDLOGDIR. В 12:30 он переместит все журналы в формате ГГГГММДД за предыдущие (и более ранние, если таковые имеются) дни.

unpythonic
источник
4
Да, но это действительно не отвечает на мой вопрос. Мой вопрос был, могу ли я использовать logrotate для этого.
Шимон Тот
@Let_Me_Be - я думал, что это неявно в моем ответе. Нет, logrotate не будет делать то, что вы хотите. То есть вы не можете сопоставлять только файлы ГГГГММДД. В противном случае вы можете приблизиться с помощью nodateext, olddir, compressи dailyварианты.
unpythonic
3

logrotate может сделать это с помощью olddir, если имя вашего файла журнала одинаково при каждом запуске, и вы можете добавлять даты. Если имя вашего файла журнала изменится, т.е. YYYYMMDD, то logrotate не сделает этого за вас.

# sample logrotate conf file
copytruncate
compress
dateformat %Y%m%d.
dateext
extension log
olddir ./logarchive

/logs/sys.log {
    rotate 7
    daily
}

Копирует и gzips /logs/sys.log в /logs/logarchive/sys.20120101.log.gz, сохраняет журналы на одну неделю.

Ясон
источник
1
Это не ответ. В журналах уже есть метки даты, и они эффективно вращаются. Let_Me_Be просто хочет сжать их. Я верю, что @jmtd прав.
Андрей Лориен
2

logrotateСам не делает этого. Я бы порекомендовал написать дополнительный скрипт и вызвать его, logrotateиспользуя postrotateопцию в конфигурации.

jmtd
источник