Имеется система с 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]
- 99K Feb 6 18:20 /var/log/syslog – размер достиг 100 КБ
- ls: cannot access ‘/var/log/syslog’: No such file or directory – файл перемещён как
/var/log/syslog.1
- 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]
Готово.
Ссылки по теме
- Сбор и просмотр логов Syslog в MySQL с помощью LogAnalyzer
- Linux: rsyslogd, MySQL (ommysql) и фильтры (RainerScript и Property-Based).