Как сжимать файлы журналов в Linux с помощью Logrotate
В системе Linux и почти во всех системах файлы журналов имеют решающее значение, когда дело доходит до изучения и устранения ошибок. Они дают важные подсказки относительно того, что могло пойти не так с различными системными службами до отказа.
Любая служба, установленная в ваших системах Linux, например веб-сервер Apache или сервер базы данных MySQL, создает файлы журнала, которые обычно хранятся в каталоге /var/log.
Со временем по мере регистрации дополнительной информации файлы журнала увеличиваются в размере и занимают больше места на жестком диске. Прежде чем вы даже узнаете об этом, файлы журналов увеличатся в размерах, занимая большую часть места на жестком диске. Если вы не будете осторожны, у вас может легко закончиться свободное место на диске.
Имея это в виду, становится разумным поддерживать файлы журнала в управляемом размере и удалять старые записи журнала, которые занимают драгоценное дисковое пространство. И здесь на помощь приходит ротация журналов.
Что такое ротация журналов?
Ротация журналов — это процесс, который создает новые файлы журналов и архивирует и удаляет старые для экономии места на диске. Процесс переименовывает текущий файл журнала. Например, apport.log становится apport.log.1, и создается новый файл журнала apport.log для регистрации новых записей журнала. Старые файлы журналов обычно сжимаются и отображаются как apport.log.2.gz , apport.log.3.gz , apport.log.4.gz и т. Д.
Процесс ротации журналов упрощается с помощью утилиты logrotate . Это инструмент, который упрощает ротацию файлов журналов, а также архивирование и удаление старых, чтобы освободить место на диске. Таким образом, logrotate выполняет следующее:
- Создание новых файлов журналов после ротации старых.
- Архивирование старых файлов журналов.
- Удаление старых файлов журналов, которые были повернуты для экономии места.
Ротация журналов обычно активируется, когда размер файлов журнала увеличивается и превышает определенный предел.
Как работает утилита logrotate
Прежде чем мы исследуем работу утилиты logrotate, убедитесь, что logrotate установлен в вашей системе.
Введите команду:
Системы Debian / Ubuntu:
$ sudo apt-get install logrotate -y
Для системы CentOS / RHEL / Fedora:
$ sudo yum install logrotate -y or $ sudo dnf install logrotate -y
Запустите команду ниже, чтобы проверить версию logrotate,
[email protected]:~$ logrotate --version logrotate 3.14.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 [email protected]:~$
Из выходных данных мы ясно видим, что у нас есть logrotate версии 3.14.0. По умолчанию logrotate предустановлен в современных дистрибутивах Linux, поэтому устанавливать его не нужно.
Файлы конфигурации Logrotate
Logrotate запускается ежедневно как задание cron, просматривая различные файлы журналов, меняя их и очищая старые файлы журналов, как определено в файле конфигурации. Есть два основных источника конфигурации, на которые нужно обратить пристальное внимание:
/etc/logrotate.conf — это основной файл конфигурации для инструмента logrotate. Он содержит настройки по умолчанию и облегчает ротацию журналов для журналов несистемных пакетов. В частности, он используетдирективу include для извлечения конфигураций, расположенных в каталоге /etc/logrotate.d . Посмотрим на файл конфигурации.
$ cat /etc/logrotate.conf
Из показанной конфигурации файл /etc/logrotate.conf еженедельно меняет файлы журнала, как указано в строке 3 .
- Ст. 7 указывает, что файлы журнала принадлежат пользователю root и группе adm.
- 10 указывает, что выполняется резервное копирование файлов журнала всего за 4 недели, после чего более старые будут очищены или удалены, чтобы освободить место на диске.
- 13 инструктирует о создании нового файла журнала после ротации текущего файла журнала.
- Оператор include в строке 22 извлекает конфигурации файлов приложения, которые перечислены в каталоге /etc/logrotate.d.
/etc/logrotate.d — это каталог, содержащий конфигурацию logrotate установленных пакетов, файлы журналов которых требуют ротации журналов. Как правило, вы также можете найти файлы конфигурации системных инструментов, таких как apt & dpkg (для систем Debian), rsyslog, ufw и cups-daemon. Вот что вы найдете:
[email protected]:~$ ls -l /etc/logrotate.d/ total 60 -rw-r--r-- 1 root root 120 Sep 5 2019 alternatives -rw-r--r-- 1 root root 126 Dec 4 20:25 apport -rw-r--r-- 1 root root 173 Apr 9 11:21 apt -rw-r--r-- 1 root root 91 Apr 1 10:49 bootlog -rw-r--r-- 1 root root 130 Jan 21 2019 btmp -rw-r--r-- 1 root root 181 Feb 17 08:19 cups-daemon -rw-r--r-- 1 root root 112 Sep 5 2019 dpkg -rw-r--r-- 1 root root 329 Feb 4 2019 nginx -rw-r--r-- 1 root root 94 Feb 8 2019 ppp -rw-r--r-- 1 root root 501 Mar 7 2019 rsyslog -rw-r--r-- 1 root root 677 Nov 29 02:08 speech-dispatcher -rw-r--r-- 1 root root 119 Mar 30 21:49 ubuntu-advantage-tools -rw-r--r-- 1 root root 178 Jan 21 22:16 ufw -rw-r--r-- 1 root root 235 Apr 13 23:37 unattended-upgrades -rw-r--r-- 1 root root 145 Feb 19 2018 wtmp [email protected]:~$
Давайте посмотрим на файл конфигурации инструмента диспетчера пакетов dpkg..
$ cat -n /etc/logrotate.d/dpkg
- monthly: указывает ротацию файлов журнала один раз в месяц.
- rotate 12: резервное копирование 12 старых файлов журнала
- compress: это означает, что повернутые файлы должны быть сжаты с использованием сжатия gzip по умолчанию с файлами журнала с расширением .gz.
- Create 644 root root: Создает новый файл журнала.
- missingok: Директива подавляет сообщения об ошибках в случае отсутствия файла журнала..
- notifempty: Bгнорирует ротацию файлов, если файл журнала пуст.
Создайте образец файла конфигурации logrotate
Предположим, что у нас есть приложение, работающее как пользователь linuxtechi, которое генерирует файлы журналов, которые хранятся в /home/linuxtechi/logs . Нам нужно настроить ротацию файлов журналов на еженедельной основе.
Но сначала мы собираемся создать файл конфигурации logrotate в домашнем каталоге, как показано:
$ vim /home/linuxtechi/logrotate.conf
Затем мы собираемся вставить показанную конфигурацию:
/home/linuxtechi/logs/*.log { weekly missingok rotate 14 compress create }
Давайте поместим это в контекст:
Файлы журнала будут обновляться еженедельно, с подавлением сообщений об ошибках, если какой-либо из файлов журнала отсутствует. В течение месяца будет выполнено резервное копирование 14 файлов журнала с созданием нового файла журнала после ротации текущего файла журнала.
Теперь мы собираемся создать каталог журналов, который будет содержать файлы журналов приложения, а затем создать файл журнала с именем app.log.
[email protected]:~$ mkdir logs && cd logs [email protected]:~/logs$ touch app.log [email protected]:~/logs$ ls app.log [email protected]:~/logs$
Теперь мы запустим команду logrotate, чтобы создать файл состояния logrotate в домашнем каталоге, чтобы проверить, были ли созданы записи журнала или нет.
$ logrotate /home/linuxtechi/logrotate.conf --state /home/linuxtechi/logrotate-state --verbose
Вы получите примерно такой результат:
Судя по выходным данным, файл журнала не менялся по той простой причине, что ротация происходит еженедельно, а возраст файла журнала составляет всего час.
Изучите файл logrotate, чтобы убедиться, что была записана какая-либо информация о запуске ротации журнала..
[email protected]:~$ cat logrotate-state logrotate state -- version 2 "/home/linuxtechi/logs/app.log" 2020-5-24-17:0:0 [email protected]:~$
Из выходных данных мы видим, что утилита logrotate подтвердила, когда последний раз рассматривала файл журнала для ротации, и напечатала метку времени.
Теперь мы заставим logrotate повернуть файл журнала — чего в противном случае не было бы сейчас, поскольку указанный интервал времени еще не превышен — используя флаг –force как показано.
$ logrotate /home/linuxtechi/logrotate.conf --state /home/linuxtechi/logrotate-state --verbose --force
Если вы вернетесь в каталог журналов, вы увидите дополнительный файл журнала, который был повернут и сжат, как показано.
[email protected]:~$ cd logs/ [email protected]:~/logs$ ls app.log app.log.1.gz [email protected]:~/logs$
Сжимайте и вращайте файлы журналов в зависимости от размера
Иногда файлы журналов могут увеличиваться в размерах и занимать место даже до указанного временного интервала для ротации, будь то ежедневная, еженедельная или ежемесячная.
Один из способов решения проблемы — указать максимальный размер файла. При превышении которого будет запускаться ротация файла журнала. Для этого укажите параметр maxsize в файле logrotate.
Например, чтобы запустить ротацию, когда размер файла превышает 40 мегабайт, включите параметр:
максимальный размер 40M
Предположим, мы создаем собственный файл ротации журналов для нашего приложения в папке /etc/logrotate.d
[email protected]:~$ cd /etc/logrotate.d/ [email protected]:/etc/logrotate.d$ sudo vi custom-app /home/linuxtechi/logs/app-access.log { daily missingok size 40M rotate 4 compress create }
Сохраните и закройте файл,
Суффикс M обозначает мегабайты , для килобайт используйте k, а G указывает размер в гигабайтах .
Файлы журнала размером более 40 мегабайт будут вращаться без учета временного интервала вращения.
Это означает, что для файла журнала, который подлежит ротации через 1 час. Он будет повернут до указанного интервала, если он превышает пороговое значение в 40 МБ.
Давайте сбросим некоторые данные в файл журнала нашего пользовательского приложения. Затем посмотрим, как logrotate будет вращать файлы журнала,
[email protected]:~$ dd if=/dev/zero of=/home/linuxtechi/logs/app-access.log bs=1M count=25 25+0 records in 25+0 records out 26214400 bytes (26 MB, 25 MiB) copied, 0.0422015 s, 621 MB/s [email protected]:~$ du -sh /home/linuxtechi/logs/app-access.log 25M /home/linuxtechi/logs/app-access.log [email protected]:~$
Используйте параметр ‘ -d ‘ в команде logrotate, чтобы выполнить пробный запуск logrotate в файле журнала, выполните следующую команду,
$ logrotate -d /etc/logrotate.d/custom-app
Как видно из выходных данных, logrotate не будет вращать файл журнала, так как его размер не превышает 40 МБ.
Теперь сделаем размер файла журнала более 40 МБ,
[email protected]:~$ cd logs/ [email protected]:~/logs$ dd if=/dev/zero of=app-access.log bs=1M count=45 45+0 records in 45+0 records out 47185920 bytes (47 MB, 45 MiB) copied, 0.136979 s, 344 MB/s [email protected]:~/logs$ du -sh app-access.log 46M app-access.log [email protected]:~/logs$
Теперь попробуйте снова запустить команду logrotate с параметром ‘-d’,
Приведенный выше вывод подтверждает, что logrotate будет вращать файл журнала, если его размер превышает 40 МБ.
Помимо улучшения ротации файлов журнала в зависимости от размера, разумно убедиться.
Что файл конфигурации logrotate вызывается с регулярной частотой с помощью задания cron.
Журнали которые так быстро увеличиваются в размере и рискуют заполнить место на диске.
Есть два способа сделать это:
Вы можете скопировать сценарий logrotate из каталога /etc/cron.daily в папку /etc/cron.hourly . Это переключит ротацию журналов на почасовую, а не на ежедневную.
Другой способ — указать задание cron в файле / etc / crontab, как показано
*/10 * * * * /etc/cron.daily/logrotate
Это будет запускать ротацию каждые 10 минут.
Чтобы узнать о дополнительных параметрах инструмента logrotate, посетите страницы руководства, как показано: