FreeBSD: настройка newsyslog для ротации логов

Автор: | 02/03/2014
 

freebsd_logoЕсли ведением логов занимается демон syslog, то их ротацией — утилита newsyslog.

Демон syslog работает постоянно, и запускается при старте системы. Утилита newsyslog — запускается по cron-у, раз в час — если не указано иначе:

# cat /etc/crontab | grep log
# Rotate log files every hour, if necessary.
0       *       *       *       *       root    newsyslog

Настройки ротации логов хранятся в файле /etc/newsyslog.conf, к примеру:

# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  *     JC

Тут:

logfilename — обязательный параметр, полный путь к файлу лога, который необходимо проверять;
owner:group — необязательный параметр, владелец/группа, которой принадлежит файл;
mode — права доступа к файлу;
count — сколько копий заархивированных файлов хранить;
size — предельный размер файла лога в килобайтах, после которого он будет заархивирован и создан новый, для указания «любой размер» — установите *;
when — время в часах, через которое файл будет заархивирован, даже если его размер не превысил заданный в size, что бы игнорировать опцию — установите *;
flags — флаги:

  • B — по умолчанию, newsyslog добавляет в новый лог-файл сообщение о том, что лог-файл был ротирован, но если лог-файл бинарный, то это сообщение испортит лог, с параметром B newsyslog не будет добавлять никаких сообщений в лог;
  • C — если лог-файл не существует, то его необходимо создать;
  • G — если указан данный флаг, то в названии лог-файла можно использовать стандартные шаблоны (например *);
  • J — сжимать лог-файл, используя bzip2;
  • N — не предупреждать никакой процесс, о ротации лог-файла;
  • W — если используются флаги Z или J, то newsyslog должен подождать, пока завершится процесс архивации;
  • Z — сжимать лог, используя gzip.

Подробнее о типах сжатия — Создание архивов: работа с tar + gzip, bzip2.

Далее:

[/pid_file] – необязательный параметр, определяющий путь к файлу, в котором хранится PID процесса приложения, работающего с данным логом. Если он указан, то приложение будет оповещено о ротации посылкой сигнала, на что оно должно произвести соответствующие действия со своей стороны;
[sig_num] – необязательный параметр, определяющий номер сигнала, посылаемый приложению при ротации, чтобы произошло переоткрытие нового лог-файла для записи. По умолчанию используется SIGHUP, т. е. «1» (в обычных случаях посылается с помощью kill -1 или kill -HUP). Некоторые демоны для переоткрытия лог-файлов требуют другого номера сигнала, как например, для nginx, php-fpm, sphinx нужен SIGUSR1, т. е. «30». Более подробно о сигналах можно посмотреть в статье Linux&FreeBSD: команды kill, nohup — сигналы и управление процессами.

Теперь — добавим новую запись в настройку newsyslog.

Сначала — создадим файл, который будет ротироваться:

# touch /var/log/somesite.access.log

Установим ему размер в 10Кб:

# truncate -s 10240 /var/log/somesite.access.log

Проверим:

# ls -hl /var/log/somesite.access.log
-rw-r--r--  1 root  wheel    10k Feb  1 12:55 /var/log/somesite.access.log

Теперь — добавляем новую строку в файл /etc/newsyslog.conf:

/var/log/somesite.access.log            600  7     1 *    ZC

Запустим newsyslog с ключём -n — в таком случае он не будет выполнять ротацию, а только отобразит — какие действия будут выполнены:

# newsyslog -n
/var/log/somesite.access.log <7Z>: trimming
rm -f /var/log/somesite.access.log.7
rm -f /var/log/somesite.access.log.7.gz
rm -f /var/log/somesite.access.log.7.bz2
rm -f /var/log/somesite.access.log.7.xz
ln /var/log/somesite.access.log /var/log/somesite.access.log.0
chmod 600 /var/log/somesite.access.log.0
Start new log...
mktemp /var/log/somesite.access.log.zXXXXXX
chmod 600 /var/log/somesite.access.log.zXXXXXX
mv /var/log/somesite.access.log.zXXXXXX /var/log/somesite.access.log
Signal all daemon process(es)...
kill -1 64569           # /var/run/syslog.pid
sleep 10
Compress all rotated log file(s)...
gzip /var/log/somesite.access.log.0
chmod 600 /var/log/somesite.access.log.0.gz

И запустим newsyslog с ключём -v для подробного режима:

# newsyslog -v
Processing /etc/newsyslog.conf
/var/log/all.log <7J>: does not exist, skipped.
/var/log/amd.log <7J>: does not exist, skipped.
/var/log/auth.log <7J>: size (Kb): 32 [100] --> skipping
...
/var/log/somesite.access.log <7Z>: size (Kb): 10 [1] --> trimming log....
Signal all daemon process(es)...
Notified daemon pid 64569 = /var/run/syslog.pid
Pause 10 seconds to allow daemon(s) to close log file(s)
Compress all rotated log file(s)...

Посмотрим на файл теперь:

# ls -hl /var/log/ | grep somesite
-rw-------  1 root      wheel      74B Feb  1 13:00 somesite.access.log
-rw-------  1 root      wheel     148B Feb  1 13:00 somesite.access.log.0
-rw-------  1 root      wheel     144B Feb  1 12:58 somesite.access.log.1.gz

Готово.

Примечание: Размещать файлы логов можно в любой директории — хоть в /home пользователя, newsyslog обработает их в любом случае.