Linux: rsyslog и «ротация» логов.

Автор: | 02/07/2019
 

Имеется система с Debian 9, запущенная на AWS EC2 с дефолтным 8-гиговым рутовым разделом.

Проблема в том, что временами /var/log/syslog и /var/log/daemon.log отжираются за сутки на пару гигов, и logrotate, который запускается раз в сутки, не успевает их сжать и выполнить ротацию.

syslog и daemon.log используются (уже некоторыми подзабытым) демоном rsyslog:

root@bttrm-dev-console:/home/admin# cat /etc/rsyslog.conf | grep 'syslog\|daemon' | grep -v \#
WorkDirectory /var/spool/rsyslog
IncludeConfig /etc/rsyslog.d/*.conf
*.*;auth,authpriv.none          -/var/log/syslog
daemon.*                        -/var/log/daemon.log
cron,daemon.none;\

Задача — добавить ротацию этих логов не через logrotate, а с помощью самого rsyslog.

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

Версия в Debian 9 на данный момент:

root@bttrm-dev-console:/home/admin# rsyslogd -v
rsyslogd 8.24.0, compiled with:

См. man rsyslog.

Скрипт ротации

Напишем простой скрипт, который будет выполнять «ротацию»:

#!/usr/local/env bash

mv -f /var/log/syslog /var/log/syslog.1 && systemctl restart rsyslog.service

Понятно, что если пробовать внедрять такую «ротацию» в продакшене — скрипт надо продумать посложнее, с хранением нескольких копий и/или сжатием логов.

Сохраним его в /usr/local/bin/syslogrotate.sh, и задаём execute:

root@bttrm-dev-console:/home/admin# chmod +x /usr/local/bin/syslogrotate.sh

Создание $outchannel

Добавим новый канал.

Создаём файл /etc/rsyslog.d/outchannels.conf:

$outchannel syslog, /var/log/syslog, 104857600, /usr/local/bin/syslogrotate.sh

На время тестов — вместо 100мб (104857600 байт) можно задать 1 Мбайт.

Конфиги из /etc/rsyslog.d/ инклюдятся в самом rsyslog.conf:

...
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
...

Проверим — создаём новый канал local0, в rsyslog.conf доабвляем:

...
local0.* :omfile:$syslog
...

Проверяем корректность конфигов rsyslog-а:

root@bttrm-dev-console:/home/admin# rsyslogd -N1
rsyslogd: version 8.24.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

Перезапускаем rsyslog:

root@bttrm-dev-console:/home/admin# systemctl restart rsyslog.service

Отправляем сообщение в канал local0 с помощью logger:

root@bttrm-dev-console:/home/admin# echo "ChannelTest" | logger -p local0.info

И проверяем содержимое /var/log/syslog:

Feb  6 17:46:34 localhost admin: ChannelTest

ОК, работает.

Теперь переключим сообщения от *.*;auth,authpriv.none на использование этого канала.

Меняем:

...
*.*;auth,authpriv.none      -/var/log/syslog
...

На:

...
*.*;auth,authpriv.none :omfile:$syslog
...

Перезапускаем rsyslog ещё раз, проверяем:

root@bttrm-dev-console:/home/admin# echo "SyslogChannelTest" | logger

Лог:

Feb  6 17:48:46 localhost admin: SyslogChannelTest

Окей, работает.

Теперь проверим работу «ротации».

Запускаем сам скрипт:

root@bttrm-dev-console:/home/admin# /usr/local/bin/syslogrotate.sh

Проверяем файлы:

root@bttrm-dev-console:/home/admin# ll /var/log/syslog*
-rw-r----- 1 root adm   1184 Feb  6 17:50 /var/log/syslog
-rw-r----- 1 root adm 541568 Feb  6 17:50 /var/log/syslog.1

Тоже всё хорошо.

Задаём для теста лимит в 102400 байт (100 KB):

$outchannel syslog, /var/log/syslog, 102400, /usr/local/bin/syslogrotate.sh

И попробуем вручную насыпать сообщений в журнал:

root@bttrm-dev-console:/home/admin# watch -n 1 'echo SyslogChannelTest | logger'

Проверяем размер сейчас:

root@bttrm-dev-console:/home/admin# ls -lh /var/log/syslog
-rw-r----- 1 root adm 6.2K Feb  6 18:02 /var/log/syslog

И спустя какое-то время:

root@bttrm-dev-console:/home/admin# ls -lh /var/log/syslog
-rw-r----- 1 root adm 99K Feb  6 18:20 /var/log/syslog
root@bttrm-dev-console:/home/admin# ls -lh /var/log/syslog
ls: cannot access '/var/log/syslog': No such file or directory
root@bttrm-dev-console:/home/admin# ls -lh /var/log/syslog
-rw-r----- 1 root adm 14K Feb  6 18:21 /var/log/syslog
  1. 99K Feb 6 18:20 /var/log/syslog — размер достиг 100 КБ
  2. ls: cannot access ‘/var/log/syslog’: No such file or directory — файл перемещён как /var/log/syslog.1
  3. 14K Feb 6 18:21 /var/log/syslog — файл создан самим rsyslog после рестарта

Копия файла:

root@bttrm-dev-console:/home/admin# ls -lh /var/log/syslog.1
-rw-r----- 1 root adm 101K Feb  6 18:20 /var/log/syslog.1

Готово.

Ссылки по теме