Как настроить ротацию журналов с помощью Logrotate в Ubuntu 20.04 / 18.04

Как настроить ротацию журналов с помощью Logrotate в Ubuntu 20.04 / 18.04

 

Файлы журнала предназначены для хранения информации о действиях системы в течение разумного периода времени, но демоны ведения журнала системы не предоставляют средств для управления размером файлов журнала. Таким образом, при отсутствии флажка файлы журнала могут увеличиваться и занимать все доступное пространство раздела, на котором они находятся. Чтобы файлы журнала не заполняли вашу систему полностью, сообщения журнала можно чередовать, что означает, что при достижении определенного порога старый файл журнала закрывается и открывается новый файл журнала.

Здесь я покажу вам, как повернуть файлы журнала с помощью logrotate в Ubuntu 18.04 / 20.04.

Что такое ротация журналов?

Ротация журналов — это процесс, который решает эти проблемы путем периодического архивирования текущего файла журнала и запуска нового. Он переименовывает и дополнительно сжимает текущие файлы журналов, удаляет старые файлы журналов и заставляет систему журналов начать использовать новые файлы журналов. Обычно он запускается автоматически через   утилиту cron . С ротацией журналов вы можете

  • запускать новый файл журнала по расписанию, например, ежедневно, еженедельно или ежемесячно
  • сжимайте старые файлы журналов, чтобы сэкономить место на диске
  • удалите старые архивы, чтобы сохранить только определенное количество старых журналов.
  • переименуйте старые файлы журналов с отметкой даты, чтобы вы знали, где искать старые журналы.
  • запускать команды до или после ротации набора журналов.

Вы можете видеть ротацию журнала как процесс, который переименовывает текущий файл журнала и устанавливает новый файл журнала для новых записей журнала. При ротации файла журнала старый файл журнала обычно копируется в файл, в котором указана дата ротации.

Шаг 1. Конфигурационные файлы logrotate

В Ubuntu 18.04 файлы конфигурации logrotate /etc/logrotate.confвместе с любыми файлами в /etc/logrotate.dглавном файле logrotate.conf задают любые настройки по умолчанию и системные файлы, которые должны быть повернуты. Файл содержит некоторые параметры, которые хорошо объяснены в комментариях.

cat /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here

Основные варианты logrotate :

  • weekly:  файлы журнала меняются один раз в неделю
  • su root syslog: архивирует журналы с использованием определенного пользователя (root) и группы (syslog), чтобы предотвратить проблемы с разрешениями
  • rotate 4: гарантирует, что сохранены четыре старые версии файла. Перед удалением журнала выполняется четыре ротации, поэтому журналы остаются в сети в течение четырех недель.
  • create:  старый файл сохраняется под новым именем, и создается новый файл.
  • compress: compress заставляет logrotate сжимать файлы журнала для экономии места. По умолчанию это делается с помощью gzip, но вы можете указать другую программу.
  • include: этот важный параметр обеспечивает включение содержимого каталога /etc/logrotate.d . В этом каталоге существуют файлы, которые определяют, как обрабатывать отдельные файлы журналов..

Каждый файл /etc/logrotate.dиспользуется для добавления дополнительных настроек или переопределения настроек по умолчанию для определенных файлов. Папка также содержит конфигурацию logrotate для всех установленных вами пакетов, которым требуется ротация журналов.

# ls -l /etc/logrotate.d
total 40
-rw-r--r-- 1 root root 120 Nov 2 2017 alternatives
-rw-r--r-- 1 root root 442 Oct 23 2017 apache2
-rw-r--r-- 1 root root 126 Nov 20 16:39 apport
-rw-r--r-- 1 root root 173 Apr 20 10:08 apt
-rw-r--r-- 1 root root 112 Nov 2 2017 dpkg
-rw-r--r-- 1 root root 146 Apr 17 17:35 lxd
-rw-r--r-- 1 root root 845 Jan 12 10:57 mysql-server
-rw-r--r-- 1 root root 501 Jan 14 16:19 rsyslog
-rw-r--r-- 1 root root 178 Aug 15 2017 ufw
-rw-r--r-- 1 root root 235 Apr 17 14:53 unattended-upgrades

Вы можете увидеть, например, конфигурацию logrotate для веб-сервера apache

# cat /etc/logrotate.d/apache2 
/var/log/apache2/*.log {
	daily
	missingok
	rotate 14
	compress
	delaycompress
	notifempty
	create 640 root adm
	sharedscripts
	postrotate
                if invoke-rc.d apache2 status > /dev/null 2>&1; then \
                    invoke-rc.d apache2 reload > /dev/null 2>&1; \
                fi;
	endscript
	prerotate
		if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
			run-parts /etc/logrotate.d/httpd-prerotate; \
		fi; \
	endscript
}

Logrotate содержит некоторые дополнительные параметры, которые вы можете увидеть выше:

  • daily: ротация журнала по дням
  • missingok: не выдавать  ошибку, если журнал отсутствует
  • delaycompress:  не сжимайте файл, пока он не будет повернут. Это сделано для предотвращения повреждения, если демон не закроет файл журнала немедленно.
  • notifyempty:  не поворачивать файл журнала, когда он пуст
  • create 640 root adm:  это создаст новые файлы журнала с установленными разрешениями, владельцем и группой
  • sharedscripts:  если подстановочный знак соответствует нескольким файлам, запускайте любые сценарии один раз для всех файлов.
  • postrotate /ndscript:  указывает некоторые команды или сценарии, которые должны выполняться до ключевого слова endcript после ротации журналов.
  • prerotate /ndscript: как postrotate /ndscript он определяет команды или сценарии, которые должны быть выполнены до начала ротации журнала.

Вы можете получить некоторую информацию о дополнительных опциях, используя руководство

man logrotate

Шаг 2. Настройте ротацию журналов с помощью logrotate

Команда logrotate обычно циклически переименовывает (или вращает) файлы журнала; файл журнала будет переименован, чтобы содержать числовое расширение или расширение даты, и будет создан новый файл журнала для приема системной информации. Если logrotate настроен на хранение только двух копий старых файлов журнала, то после двух ротаций журнала самый старый файл журнала будет автоматически удален.

Обычно команда logrotate устанавливается по умолчанию на вашем Ubuntu 18.04, и вы можете проверить версию, как показано ниже.

# logrotate --version
logrotate 3.11.0

По умолчанию logrotate запускается ежедневно путем выполнения сценария оболочки.  /etc/cron.daily/logrotate  увидите, что другие файлы cron не содержат никаких файлов logrotate.

cat /etc/cron.daily/logrotate 
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

Вы можете увидеть, что будет делать конфигурация приложения logrotate, если она выполняется с -dпараметром команды

# logrotate -d /etc/logrotate.d/mysql-server 
reading config file /etc/logrotate.d/mysql-server
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries

Handling 1 logs

rotating pattern: /var/log/mysql.log /var/log/mysql/*log  after 1 days (7 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mysql.log
error: skipping "/var/log/mysql.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
Creating new state
considering log /var/log/mysql/error.log
Creating new state
  Now: 2018-05-22 06:02
  Last rotated at 2018-05-22 06:00
  log does not need rotating (log has been already rotated)

Вы можете настроить ротацию журналов как пользователь root и как пользователь без полномочий root.

а) Настроить логротацию для установленных серверных пакетов

Файлы конфигурации Logrotate от имени пользователя root создаются в  /etc/logrotate.dпапке ежедневно. Например, мы настроим ротацию логов для супервизора инструмента мониторинга . Сначала мы создадим файл ротации журналов, в котором мы укажем файл конфигурации, в котором будут храниться журналы.

# vim /etc/logrotate.d/supervisor
/var/log/supervisor/superviz.log {
        daily
        create 0640 root root
        missingok
        dateext
        rotate 3
        size=1M
        notifempty
        sharedscripts
        mail alain@infoit.com.ua
}

Поясним некоторые варианты:

  • dateext: использует дату как расширение для старых версий файлов журнала
  • size:  файлы журналов, размер которых превышает указанный здесь размер
  • mail:  чтобы дать команду logrotate отправить его содержимое по электронной почте на указанный адрес перед его перезаписью. У вас должен быть работающий почтовый сервер

Теперь мы можем протестировать конфигурацию, вызвав logrotate в режиме отладки, который указывает на основную конфигурацию, содержащую нашу папку. Команда покажет некоторую информацию, но мы отсортируем только те, которые касаются нашей конфигурации.

# logrotate /etc/logrotate.conf --debug
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apache2
reading config file apport
reading config file apt
reading config file dpkg
reading config file lxd
reading config file mysql-server
reading config file rsyslog
reading config file supervisor
reading config file ufw
reading config file unattended-upgrades
Reading state from file: /var/lib/logrotate/status
...
...
rotating pattern: /var/log/supervisor/supervisord.log  1048576 bytes (3 rotations)
empty log files are not rotated, old logs mailed to alain@infoit.com.ua
switching euid to 0 and egid to 106
considering log /var/log/supervisor/supervisord.log
Creating new state
  Now: 2018-05-22 08:16
  Last rotated at 2018-05-22 08:00
  log does not need rotating (log size is below the 'size' threshold)
switching euid to 0 and egid to 0
....
....

Как видите, наша конфигурация пока не требует ротации. Это потому, что размер условия еще не проверен. Если эта команда выполняется без ошибок, это означает, что конфигурация выглядит хорошо.

б) Настройте ротацию журналов для пользовательского приложения

Вы можете настроить ротацию журналов для пользовательских приложений, которые создают журналы и запускаются от имени пользователя без полномочий root. По умолчанию logrotate запускается ежедневно, поэтому, если нам нужно запускать наше приложение ежечасно, мы создадим конфигурацию logrotate вне папки по умолчанию.

Давайте рассмотрим пример, настроив ротацию логов для Discord . Мы создадим личную папку, которая будет содержать основной файл конфигурации logrotate и папку для файлов журнала. Это приложение не понимает ротации журналов, поэтому logrotate справится с этим, используя реализацию копирования и усечения.

$ vim apps/logrotate.conf
/home/alain/apps/logs/discord.log {
        hourly
        copytruncate
        missingok
        dateext
        rotate 10
        compress
}

Мы использовали новые параметры  copytruncate, которые обрезают  старый файл журнала на месте после создания копии, вместо того, чтобы перемещать старый файл и создавать новый. Это полезно для служб, которым нельзя приказать закрыть файлы журналов.

Мы можем протестировать нашу конфигурацию, но нам нужно указать файл состояния. Этот файл записывает, что logrotate видел и делал при последнем запуске, чтобы он знал, что делать при следующем запуске. Обратите внимание, что мы запускаем команду как пользователь без полномочий root

$ logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries

Handling 1 logs

rotating pattern: /home/alain/apps/logs/discord.log  hourly (10 rotations)
empty log files are rotated, old logs are removed
considering log /home/alain/apps/logs/discord.log
Creating new state
  Now: 2018-05-22 10:09
  Last rotated at 2018-05-22 10:00
  log does not need rotating (log has been already rotated)

Если вы попробуете ту же команду через несколько часов, вы сможете увидеть в выводе некоторую дополнительную информацию, такую ​​как усечение и сжатие информации.

logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries
Creating new state

Handling 1 logs

rotating pattern: /home/alain/apps/logs/discord.log  hourly (10 rotations)
empty log files are rotated, old logs mailed to alain@infoit.com.ua
considering log /home/alain/apps/logs/discord.log
  Now: 2018-05-22 22:52
  Last rotated at 2018-05-22 10:23
  log needs rotating
rotating log /home/alain/apps/logs/discord.log, log->rotateCount is 10
dateext suffix '-2018052222'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
copying /home/alain/apps/logs/discord.log to /home/alain/apps/logs/discord.log-2018052222
truncating /home/alain/apps/logs/discord.log
compressing log with: /bin/gzip

Вы должны помнить, что конфигурация logrotate определяется файловым глобусом, который соответствует файлам журнала, за которым следует серия инструкций, заключенных в фигурные скобки. Если параметр не указан в разделе, прикрепленном к имени файла журнала, /etc/logrotate.confприоритет имеет параметр верхнего уровня from . Файлы журнала, которые были повернуты, нигде не хранятся; они просто исчезли, поэтому вам следует подумать о том, чтобы принять меры.