В любой производственной серверной среде управление файлами журналов является одним из важнейших аспектов системного администрирования. Файлы журналов содержат ценную информацию о системных событиях, поведении приложений и потенциальных проблемах, что делает их незаменимыми для устранения неполадок и мониторинга. Однако, если не принимать меры, файлы журналов могут быстро расти, занимая значительное дисковое пространство и потенциально приводя к снижению производительности или даже сбоям системы.
Logrotate это мощная утилита, предназначенная для решения этой проблемы путем автоматического вращения, сжатия и обрезки файлов журналов на основе заданных правил и расписаний. Регулярно сжимая и архивируя старые файлы журналов, а также удаляя устаревшие, Logrotate обеспечивает эффективное использование дискового пространства и сохранение управляемости файлов журналов.
В этом подробном руководстве мы рассмотрим функциональность Logrotate, его стандартную конфигурацию на Ubuntu 20.04 и 22.04, а также пройдемся по процессу настройки пользовательских правил ротации журналов для вымышленного приложения.
Предварительные условия
Прежде чем приступить к работе, убедитесь, что у вас есть следующее:
- Сервер Ubuntu 20.04 или 22.04 с учетной записью пользователя, не являющегося пользователем root, с привилегиями sudo.
- Знакомство с основными операциями командной строки и редактированием текста.
Logrotate предустановлен на Ubuntu, но если вам нужно установить его вручную, вы можете сделать это, выполнив следующие команды:
$ sudo apt update
$ sudo apt install logrotate
Шаг 1: Проверка версии Logrotate
Несмотря на то, что Logrotate поставляется предустановленным на Ubuntu, нелишним будет проверить установленную версию и ее настройки по умолчанию. Это можно сделать, выполнив следующую команду:
$ logrotate --version
Эта команда отобразит номер версии, а также информацию о настройках по умолчанию, таких как почтовая команда, команда сжатия и путь к файлу состояния. Вот пример вывода:
logrotate 3.19.0
Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes
Если вы используете дистрибутив, отличный от Ubuntu, или у вас существенно другая версия Logrotate, некоторые параметры конфигурации, описанные в этом руководстве, могут быть неприменимы. В таких случаях обратитесь к man-страницам (man logrotate
) или онлайн-документацию по вашей конкретной версии Logrotate.
Шаг 2: Изучение конфигурации по умолчанию
В системах Ubuntu конфигурация Logrotate управляется в основном через два места:
/etc/logrotate.conf
: Этот файл содержит настройки по умолчанию и устанавливает ротацию журналов для нескольких системных журналов, которые не принадлежат ни одному из установленных пакетов. Он также включает в себя файлы конфигурации из/etc/logrotate.d
каталога с помощьюinclude
заявление./etc/logrotate.d/
: Этот каталог содержит файлы конфигурации для различных установленных пакетов, требующих вращения журнала. Например, вы найдете файлы конфигурации для основных системных инструментов, таких какapt
,dpkg
,rsyslog
, и другие.
Давайте рассмотрим конфигурацию по умолчанию в /etc/logrotate.conf
файле:
$ sudo cat /etc/logrotate.conf
Этот файл устанавливает еженедельную ротацию журналов для файлов журналов, принадлежащих пользователю root и группе syslog. Он сохраняет четыре ротируемых файла журналов (rotate 4
) и создает новые пустые файлы журналов после ротации (create
). Кроме того, он включает в себя конфигурационные файлы из /etc/logrotate.d
каталога.
Далее рассмотрим пример файла конфигурации из каталога /etc/logrotate.d
каталога для apt
пакета:
$ sudo cat /etc/logrotate.d/apt
/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
Этот файл содержит блоки конфигурации для двух файлов журнала: term.log
и history.log
, расположенные в /var/log/apt/
каталоге. Здесь используются следующие параметры конфигурации:
rotate 12
: Хранить 12 старых ротируемых файлов журналов (вместо 4 по умолчанию).monthly
: Переворачивать журналы раз в месяц (вместо установленного по умолчанию еженедельного).compress
: Сжимать ротированные файлы журналов с помощью gzip.missingok
: Не генерировать ошибку, если файл журнала отсутствует.notifempty
: Не разворачивать файл журнала, если он пуст.
Любые опции, не указанные в этих конфигурационных блоках, наследуют значения по умолчанию из /etc/logrotate.conf
.
Шаг 3: Настройка пользовательской конфигурации
Хотя конфигурации по умолчанию достаточно для большинства системных журналов, вам может потребоваться настроить пользовательские правила ротации журналов для ваших приложений. Logrotate предлагает два основных подхода для этого:
- Добавление конфигурации в
/etc/logrotate.d/
- Создание независимой конфигурации
Добавление конфигурации в /etc/logrotate.d/
Этот подход предполагает создание нового файла конфигурации в папке /etc/logrotate.d/
каталоге. Конфигурация, определенная в этом файле, будет запускаться ежедневно от имени пользователя root, наряду со всеми другими заданиями Logrotate по умолчанию.
Давайте настроим конфигурацию для вымышленного веб-приложения под названием «Your-app», которое генерирует access.log
и error.log
файлы в /var/log/your-app/
каталоге. Приложение запускается как www-data
пользователя и группы.
Сначала создайте новый файл конфигурации:
$ sudo nano /etc/logrotate.d/your-app
Добавьте в файл следующую конфигурацию:
/var/log/your-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload your-app
endscript
}
Вот что делает каждая опция:
daily
: Ежедневная ротация журналов (отменяет стандартную еженедельную ротацию).missingok
: Не генерировать ошибку, если файл журнала отсутствует.rotate 14
: Сохранять 14 старых ротированных файлов журнала.compress
: Сжать ротированные файлы журналов с помощью gzip.notifempty
: Не поворачивайте файл журнала, если он пуст.create 0640 www-data www-data
: Создайте новый пустой файл журнала с правами доступа0640
, принадлежащийwww-data
пользователю и группе.sharedscripts
: Запуск любых скриптов, определенных в конфигурации (например,postrotate
) только один раз за прогон, а не для каждого файла журнала.postrotate
наendscript
: Этот блок содержит скрипт, который будет выполняться после ротации журнала. В этом случае он перезагружаетyour-app
службу, чтобы она начала писать в новый файл журнала.
Сохраните и закройте файл. Вы можете проверить конфигурацию, выполнив пробный запуск:
$ sudo logrotate /etc/logrotate.conf --debug
Эта команда запускает Logrotate со стандартным конфигурационным файлом и включает режим отладки, выводя информацию о том, какие файлы журналов будут обрабатываться и какие действия будут выполняться.
Создание независимой конфигурации
В некоторых случаях вам может потребоваться запустить Logrotate от имени пользователя, не являющегося root, или ротировать журналы чаще, чем ежедневное расписание по умолчанию. В таких ситуациях можно создать независимую конфигурацию Logrotate и настроить задание cron для ее запуска с нужным интервалом.
Предположим, у вас есть приложение, запущенное под именем bob
пользователя, генерирующее журналы в /home/bob/logs/
каталоге. Вы хотите вращать эти журналы ежечасно.
Сначала создайте файл конфигурации в своем домашнем каталоге:
$ nano /home/bob/logrotate.conf
Добавьте следующую конфигурацию:
/home/bob/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
Эта конфигурация будет ротировать журналы ежечасно, сохраняя 24 старых ротированных файла журнала, сжимая их и создавая новый пустой файл журнала после ротации.
Сохраните и закройте файл.
Далее создайте файл журнала для тестирования:
$ cd ~
$ mkdir logs
$ touch logs/access.log
Теперь запустите Logrotate с новой конфигурацией и укажите местоположение файла состояния:
$ logrotate /home/bob/logrotate.conf --state /home/bob/logrotate-state --verbose
[--state
задает местоположение файла состояния, в котором хранится информация о журналах, обрабатываемых во время каждого запуска. Опция --verbose
выводит подробную информацию о действиях Logrotate.
Вы должны увидеть вывод, похожий на следующий:
reading config file /home/bob/logrotate.conf
Handling 1 logs
rotating pattern: /home/bob/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/bob/logs/access.log
log does not need rotating
Logrotate записал информацию о журналах, с которыми он столкнулся, в файл состояния. Содержимое файла состояния можно просмотреть с помощью:
$ cat /home/bob/logrotate-state
Если вы выполните ту же команду через час, файл журнала должен быть повернут, как и ожидалось.
Чтобы заставить Logrotate вращать файл журнала немедленно (в целях тестирования), используйте команду --force
флаг:
$ logrotate /home/bob/logrotate.conf --state /home/bob/logrotate-state --verbose --force
Наконец, настройте задание cron для ежечасного запуска Logrotate. Откройте кронтаб вашего пользователя с помощью:
$ crontab -e
Добавьте следующую строку в файл crontab:
14 * * * * /usr/sbin/logrotate /home/bob/logrotate.conf --state /home/bob/logrotate-state
Это запустит программу logrotate
на 14-й минуте каждого часа, используя полный путь к файлу logrotate
двоичному файлу и указывая местоположение файла конфигурации и файла состояния.
Сохраните и выйдите из файла crontab. Теперь задание cron будет выполняться по указанному расписанию.
Дополнительные параметры конфигурации
Хотя примеры, рассмотренные в этом руководстве, демонстрируют некоторые общие параметры Logrotate, существует множество дополнительных опций для тонкой настройки поведения ротации журнала. Вот несколько наиболее важных опций:
dateext
: Эта опция добавляет расширение даты к именам ротируемых файлов журнала, что облегчает определение периода времени, охватываемого каждым файлом журнала.dateformat
: Указывает формат даты, который будет использоваться сdateext
.mail
: Отправляет отчет о повороте файла журнала на указанный адрес электронной почты.olddir
: Перемещает ротированные файлы журнала в другой каталог, а не сохраняет их в том же каталоге, что и текущий файл журнала.prerotate
иpostrotate
: Эти опции позволяют запускать сценарии до и после ротации журнала соответственно.size
: Ротация файлов журнала в зависимости от их размера, а не по фиксированному расписанию.
Вы можете изучить эти и другие варианты, обратившись к странице руководства Logrotate (man logrotate
) или онлайн-документацию.
Заключение
Эффективное управление файлами журналов очень важно для поддержания здоровой среды сервера и обеспечения сохранности и доступности ценных данных журналов в случае необходимости. Logrotate — это мощный инструмент, который упрощает эту задачу, автоматизируя ротацию, сжатие и обрезку журналов на основе настраиваемых правил и расписаний.
Следуя примерам и лучшим практикам, описанным в этом руководстве, вы сможете эффективно управлять файлами журналов для своих приложений, обеспечивая оптимальное использование дискового пространства и легкий доступ к историческим данным журналов в случае необходимости.