Когда приложения в операционной системе Linux работают, инициируются фоновые процессы, связанные с этим приложением. События, связанные с выполнением этих приложений, записываются в файл журнала (генерируемый приложениями и/или фоновыми процессами).
Поскольку лог-файлы генерируются постоянно; особенно в загруженной системе, такой как серверная, необходимо держать их размер под контролем, чтобы они не поглотили все место на жестком диске.
Для системы Linux, в которой запущено не слишком много приложений, файлы журналов можно легко и вручную уменьшать по расписанию. Однако такой подход к управлению файлами журналов неприменим к большим системам Linux.
На помощь приходит Logrotate, который позаботится об автоматической ротации и сжатии растущих файлов журналов, чтобы гарантировать свободу дискового пространства системы.
В этой статье мы рассмотрим установку и базовое использование утилиты Logrotate для управления файлами журналов в системе Linux.
Как установить Logrotate в Linux.
Утилита управления файлами журналов Logrotate предустановлена в основных дистрибутивах Linux. Если он не установлен в вашей системе Linux, исправить это можно, выполнив следующие команды:
$ sudo apt install logrotate [на debian, Ubuntu и Mint]
$ sudo yum install logrotate [на RHEL/Centos/Fedora, а также Rocky Linux/AlmaLinux]
$ sudo emerge -a app-admin/logrotate [на Gentoo Linux]
$ sudo pacman -S logrotate [на Arch Linux]
$ sudo zypper install logrotate [на OpenSUSE]
Понимание конфигурации Logrotate.
В основном файле конфигурации Logrotate хранится информация о ротации журналов, установленных по умолчанию и другие настройки. Посмотреть его можно следующей командой:
$ 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
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may be also be configured here.
Основной каталог конфигурации Logrotate — это место, где расположены ассоциации файлов журналов к установленным пакетам Linux, которым требуется помощь в ротации, они будут помещать свои конфигурации logrotate в этот каталог. Как показано на приведено ниже, системные инструменты, такие как dnf, syslog и chrony, уже перечислены.
$ ls -l /etc/logrotate.d/
-rw-r--r--. 1 root root 130 Feb 19 2018 btmp
-rw-r--r--. 1 root root 160 May 12 2021 chrony
-rw-r--r--. 1 root root 88 Apr 12 2021 dnf
-rw-r--r--. 1 root root 172 Mar 11 2021 iscsiuiolog
-rw-r--r--. 1 root root 162 Jan 10 2022 kvm_stat
-rw-r--r--. 1 root root 291 Jan 13 2022 pxp-agent
-rw-r--r--. 1 root root 155 Jan 27 2022 samba
-rw-r--r--. 1 root root 237 Dec 17 2021 sssd
-rw-r--r--. 1 root root 88 Jan 24 2022 subscription-manager
-rw-r--r--. 1 root root 226 Jan 20 2022 syslog
-rw-r--r--. 1 root root 145 Feb 19 2018 wtmp
-rw-r--r-- 1 root root 132 Mar 8 2021 zabbix-agent
Например, на основе приведенного выше снимка экрана мы могли бы просмотреть информацию о файле конфигурации Logrotate диспетчера пакетов dnf следующим образом:
$ cat /etc/logrotate.d/dnf
/var/log/hawkey.log {
missingok
notifempty
rotate 4
weekly
create
}
На основе приведенного выше вывода представлен один файл журнала hawkey.log. В нем имеются следующие параметры:
- missingok не связывать сообщение об ошибке с отсутствующим файлом журнала.
- notifempty гарантирует, что пустые файлы журналов не ротируются.
- rotate 4 обеспечивает сохранение 4 старых файла журнала.
- weekly обеспечивает ротацию журнала один раз в неделю.
- create после ротации создать пустой log-файл.
Пример создания файла конфигурации Logrotate.
Мы рассмотрим два сценария:
1. Добавление файла конфигурации в каталог /etc/logrotate.d/
Предположим, что в нашей системе установлено вымышленное веб-серверное приложение с именем sample-app, и мы хотим настроить ротацию его журналов. Сначала мы создадим новый файл конфигурации журнала в каталоге /etc/logrotate.d. Для этого используем любой удобный текстовый редактор.
$ sudo vi /etc/logrotate.d/sample-app
И внесем в него следующие строки:
/var/log/sample-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload sample-app
endscript
}
Затем создадим каталог журналов.
$ mkdir /var/log/sample-app
В такой конфигурации, после завершения ротации журнала создается новый файл журнала с разрешением 0640 для владельца www-data и для группы владельцев www-data. Флаг sharedscripts гарантирует, что последующие сценарии будут выполняться один раз за один прогон.
Скрипт внутри блока postrotate to endscript выполняется после успешной ротации журналов и перед сжатием сгенерированных журналов.
Для пробного запуска и тестирования приведенной выше конфигурации Logrotate давайте выполним:
$ sudo logrotate /etc/logrotate.conf --debug
На своей машине я получил следующий вывод
$ sudo logrotate /etc/logrotate.conf --debug
WARNING: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want.
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file btmp
reading config file chrony
reading config file dnf
reading config file iscsiuiolog
reading config file kvm_stat
reading config file pxp-agent
reading config file samba
olddir is now /var/log/samba/oldreading config file sample-app
reading config file sssd
reading config file subscription-manager
reading config file syslog
reading config file wtmp
reading config file zabbix-agent
...
Несмотря на то, что приложение не существует, Logrotate смог оценить состояние его файла конфигурации. А сгенерированные и сжатые журналы должны храниться в /var/log/sample-app.
2.Создание независимой конфигурации Logrotate.
Приложение может быть запущено от обычного пользователя. Допустив в системе есть пользовательская учетная запись user. Cгенерированные им журналы хранятся в каталоге /home/user/logs/.
В таком случае файл конфигурации Logrotate должен находиться в домашнем каталоге:
$ vi /home/user/logrotate.conf
Создадим такой файл в домашней директории со следующим содержанием:
/home/user/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
В такой конфигурации файлы журнала будут генерироваться ежечасно.
Теперь необходимо создать каталог журналов
$ cd ~
$ mkdir logs
$ touch logs/access.log
Теперь проверим как все это работает.
$ logrotate /home/user/logrotate.conf --state /home/user/logrotate-state --verbose
reading config file /home/user/logrotate.conf
Reading state from file: /home/user/logrotate-state
Allocating hash table for state file, size 64 entries
Handling 1 logs
rotating pattern: /home/user/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/user/logs/access.log
Creating new state
Now: 2022-08-25 23:22
Last rotated at 2022-08-25 23:00
log does not need rotating (log has been already rotated)
Параметр —verbose, позволяет получить более детальный вывод. В приведенной выше настройке ничего не было ротировано, так как Logrotate видит файл в первый раз. Однако в файле состояния Logrotate будет отображаться записанная информация о запуске.
$ cat /home/user/logrotate-state
logrotate state -- version 2
"/home/user/access.log" 2022-8-25-23:0:0
Чтобы настроить автоматический запуск Logrotate для текущего пользователя, необходимо открыть пользовательский crontab:
$ crontab -e
и добавьте следующую в него запись:
14 * * * * /usr/sbin/logrotate /home/user/logrotate.conf --state /home/user/logrotate-state
Примерно через час каталог $HOME/logs должен быть заполнен свернутым и сжатым файлом журнала.
Теперь мы умеем настраивать и ротировать файлы журналов как для всех пользователей в системе, так и для обычных пользователей через Logrotate в Linux.
Заключение.
Вот и добавилось в копилку навыков еще одно умение. Надеюсь кому-то пригодится.
А если Вам понравилась статья, то подписывайтесь на мой канал дзен (кнопка ниже), либо в telegrmm и ВКонтакте. Так же не забудьте про мой сайт RoadIT, в котором я потихоньку собираю материал, знание которого приведет вас в мир IT.