Как сжимать файлы журналов в Linux с помощью Logrotate

Как сжимать файлы журналов в 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
}

Сохраните и закройте файл,

Суффикс обозначает мегабайты , для килобайт используйте k, а указывает размер в гигабайтах .

Файлы журнала размером более 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, посетите страницы руководства, как показано: