Linux: rsyslog и “ротация” логов.

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

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

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

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

[simterm]

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;\

[/simterm]

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

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

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

[simterm]

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

[/simterm]

См. 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:

[simterm]

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

[/simterm]

Создание $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-а:

[simterm]

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.

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

И проверяем содержимое /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 ещё раз, проверяем:

[simterm]

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

[/simterm]

Лог:

Feb  6 17:48:46 localhost admin: SyslogChannelTest

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

Теперь проверим работу “ротации”.

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

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

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

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

  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 после рестарта

Копия файла:

[simterm]

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

[/simterm]

Готово.

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