Эффективное управление файлами журналов - важная задача для системного администратора Linux.
В этой статье мы рассмотрим, как выполнять следующие операции с файлами журнала с помощью утилиты UNIX logrotate.
- Ротировать файл журнала, когда размер файла достигает определенного размера
- Продолжать записывать информацию журнала во вновь созданный файл после ротирования старого файла журнала
- Сжать ротированный файлы журнала
- Укажите параметр сжатия для ротированных файлов журнала
- Ротировать старые файлы журнала с указанием даты в имени файла
- Выполнять пользовательские сценарии оболочки сразу после ротирования журнала
- Удаление старых ротированных файлов журнала
Конфигурационные файлы Logrotate
Ниже перечислены основные файлы, которые необходимо знать для правильной работы logrotate.
- /usr/sbin/logrotate - сама команда logrotate.
- /etc/cron.daily/logrotate - Этот сценарий оболочки выполняет команду logrotate каждый день.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/sh # skip in favour of systemd timer if [ -d /run/systemd/system ]; then exit 0 fi # this cronjob persists removals (but not purges) if [ ! -x /usr/sbin/logrotate ]; then exit 0 fi /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit $EXITVALUE |
/etc/logrotate.conf - конфигурация ротации журнала для всех файлов журнала задается в этом файле.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | cat /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file #dateext # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may be also be configured here. |
/etc/logrotate.d - Когда отдельные пакеты устанавливаются в систему, они сбрасывают информацию о конфигурации ротации журнала в этот каталог. Например, конфигурационная информация yum log rotate показана ниже.
1 2 3 4 5 6 7 8 | cat /etc/logrotate.d/yum /var/log/yum.log { missingok notifempty size 30k yearly create 0600 root root } |
Опция размера Logrotate: Ротация файла журнала, когда размер файла достигает определенного предела
Если вы хотите ротировать файл журнала (например, /tmp/output.log) на каждый 1 КБ, создайте файл logrotate.conf, как показано ниже.
1 2 3 4 5 6 | cat logrotate.conf /tmp/output.log { size 1k create 700 bala bala rotate 4 } |
Эта конфигурация logrotate имеет следующие три опции:
- size 1k - logrotate запускается, только если размер файла равен (или больше) этому размеру.
- create - ротировать исходный файл и создавать новый файл с указанным разрешением, пользователем и группой.
- rotate - ограничивает количество ротаций файла журнала. Таким образом, будут сохранены только последние 4 ротированных файла журнала.
Теперь запустите команду logrotate, как показано ниже. Опция -s указывает имя файла для записи состояния logrotate.
$ logrotate -s /var/log/logstatus logrotate.conf
Если вам требуется ротация журнала для некоторых файлов, подготовьте конфигурацию logrotate и запустите команду logroate вручную.
Пожалуйста, помните, что после ротации журнала, файл журнала, соответствующий службе, будет по-прежнему указывать на ротированный файл (output.log.1) и продолжать писать в него. Вы можете использовать описанный выше метод, если хотите ротировать apache access_log или error_log каждые 5 МБ.
В идеале, вы должны изменить файл /etc/logrotate.conf, чтобы указать информацию logrotate для конкретного файла журнала.
Опция Logrotate copytruncate: Продолжайте записывать информацию журнала во вновь созданный файл после ротации старого файла журнала.
1 2 3 4 5 6 | $ cat logrotate.conf /tmp/output.log { size 1k copytruncate rotate 4 } |
copytruncate указывает logrotate создать копию оригинального файла (т.е. ротировать оригинальный файл журнала) и усечь оригинальный файл до размера ноль байт. Это помогает соответствующему сервису, принадлежащему данному файлу журнала, записывать данные в нужный файл.
Опция сжатия Logrotate: Сжать ротированне файлы журнала
Если вы используете опцию compress, как показано ниже, ротированные файлы будут сжаты с помощью утилиты gzip.
1 2 3 4 5 6 7 8 | cat logrotate.conf /tmp/output.log { size 1k copytruncate create 700 bala bala rotate 4 compress } |
Опция Logrotate dateext: Ротация старого файла журнала с датой в имени файла журнала
1 2 3 4 5 6 7 8 9 | cat logrotate.conf /tmp/output.log { size 1k copytruncate create 700 bala bala dateext rotate 4 compress } |
После вышеуказанной конфигурации вы заметите дату в ротированном файле журнала.
Это сработает только один раз в день. Потому что когда он попытается выполнить ротацию в следующий раз в тот же день, ранее ротированный файл будет иметь то же имя. Таким образом, logrotate не будет успешным после первого запуска в тот же день.
Опция Logrotate monthly, daily, weekly: Ротировать файл журнала еженедельно/ежедневно/ежемесячно
Для выполнения ротации ежемесячно один раз
1 2 3 4 5 6 7 | cat logrotate.conf /tmp/output.log { monthly copytruncate rotate 4 compress } |
Добавьте ключевое слово weekly, как показано ниже, для еженедельной ротации журнала.
1 2 3 4 5 6 7 | cat logrotate.conf /tmp/output.log { weekly copytruncate rotate 4 compress } |
Добавьте ключевое слово daily, как показано ниже, для ежедневной ротации журналов. Вы также можете ротировать журналы ежечасно.
1 2 3 4 5 6 7 | cat logrotate.conf /tmp/output.log { daily copytruncate rotate 4 compress } |
Опция Logrotate postrotate endscript: Запуск пользовательских сценариев оболочки сразу после ротации журнала
Logrotate позволяет запускать собственные пользовательские сценарии оболочки после завершения ротации файлов журнала. Следующая конфигурация указывает, что после ротации журнала будет выполняться script.sh.
1 2 3 4 5 6 7 8 9 10 | $ cat logrotate.conf /tmp/output.log { size 1k copytruncate rotate 4 compress postrotate /home/script.sh endscript } |
Опция Logrotate maxage: Удаление старых ротированных файлов журнала
Logrotate автоматически удаляет ротированные файлы через определенное количество дней. Следующий пример показывает, что ротированные файлы журнала будут удалены через 100 дней.
1 2 3 4 5 6 7 8 | cat logrotate.conf /tmp/output.log { size 1k copytruncate rotate 4 compress maxage 100 } |
Опция Logrotate missingok: Не возвращать ошибку, если файл журнала отсутствует
Вы можете игнорировать сообщение об ошибке, если фактический файл недоступен, используя эту опцию, как показано ниже.
1 2 3 4 5 6 7 8 | cat logrotate.conf /tmp/output.log { size 1k copytruncate rotate 4 compress missingok } |
Logrotate compresscmd и опция compressext: Укажите команду сжатия для ротации файла журнала
1 2 3 4 5 6 7 8 9 10 | cat logrotate.conf /tmp/output.log { size 1k copytruncate create compress compresscmd /bin/bzip2 compressext .bz2 rotate 4 } |
Выше указаны следующие параметры сжатия:
- compress - Указывает, что сжатие должно быть выполнено.
- compresscmd - Указывает, какой тип команды сжатия должен быть использован. Например: /bin/bzip2
- compressext - Указать расширение для ротированного файла журнала. Без этой опции ротированный файл будет иметь расширение по умолчанию .gz. Поэтому, если вы используете bzip2 compressioncmd, укажите расширение .bz2, как показано в примере выше.