Настраиваем логи или ротация логов в FreeBSD

Задача:
---------------------------------------------------------------Настроить ротацию логов при помощи newsyslog, для сервисов сервера
newsyslog – это сервис, предотвращающий бесконтрольный рост лог-файлов. Он осуществляет ротацию логов через заданный отрезок времени и удаляет ставшие ненужными старые файлы.
Если за ведение логов во FreeBSD отвечает демон syslog, то их ротацией — newsyslog.
Если демон syslog работает постоянно, и запускается при старте системы, то newsyslog работает при помощи cron.
# cat /etc/crontab | grep log # Rotate log files every hour, if necessary. 0 * * * * root newsyslog
Согласно стандартной настройки, ротация логов происходит раз в час
* * * * * выполняемая команда - - - - - | | | | | | | | | ----- День недели (0 - 7) (Воскресенье =0 или =7) | | | ------- Месяц (1 - 12) | | --------- День (1 - 31) | ----------- Час (0 - 23) ------------- Минута (0 - 59)
Настроить ротацию логов можно при помощи файла /etc/newsyslog.conf:
# cat /etc/newsyslog.conf # configuration file for newsyslog # $FreeBSD: releng/11.2/etc/newsyslog.conf 266463 2014-05-20 03:00:20Z bdrewery $ # # Entries which do not specify the '/pid_file' field will cause the # syslogd process to be signalled when that log file is rotated. This # action is only appropriate for log files which are written to by the # syslogd process (ie, files listed in /etc/syslog.conf). If there # is no process which needs to be signalled when a given log file is # rotated, then the entry for that file should include the 'N' flag. # # The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'. # # Note: some sites will want to select more restrictive protections than the # defaults. In particular, it may be desirable to switch many of the 644 # entries to 640 or 600. For example, some sites will consider the # contents of maillog, messages, and lpd-errs to be confidential. In the # future, these defaults may change to more conservative ones. # # 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 @0101T JC /var/log/console.log 600 5 100 * J /var/log/cron 600 3 100 * JC /var/log/daily.log 640 7 * @T00 JN /var/log/debug.log 600 7 100 * JC /var/log/init.log 644 3 100 * J /var/log/kerberos.log 600 7 100 * J /var/log/lpd-errs 644 7 100 * JC /var/log/maillog 640 7 * @T00 JC /var/log/messages 644 5 100 @0101T JC /var/log/monthly.log 640 12 * $M1D0 JN /var/log/pflog 600 3 100 * JB /var/run/pflogd.pid /var/log/ppp.log root:network 640 3 100 * JC /var/log/devd.log 644 3 100 * JC /var/log/security 600 10 100 * JC /var/log/sendmail.st 640 10 * 168 BN /var/log/utx.log 644 3 * @01T05 B /var/log/weekly.log 640 5 * $W6D0 JN /var/log/xferlog 600 7 100 * JC <include> /etc/newsyslog.conf.d/* <include> /usr/local/etc/newsyslog.conf.d/*
- logfilename — полный путь к файлу лога
- owner:group — необязательный параметр, владелец/группа, которой принадлежит файл;
- mode — права доступа к файлу
- count — сколько заархивированных копий хранить
- size — предельный размер файла лога в килобайтах, после которого он будет заархивирован и создан новый, * означает «любой размер»
- when — время в часах, через которое файл будет заархивирован, даже если его размер не превысил заданный в size, что бы игнорировать опцию — установите *
- flags — флаги:
- B — по умолчанию, newsyslog добавляет в новый лог-файл сообщение о том, что лог-файл был ротирован, но если лог-файл бинарный, то это сообщение испортит лог, с параметром B newsyslog не будет добавлять никаких сообщений в лог;
- C — если лог-файл не существует, то его необходимо создать;
- G — если указан данный флаг, то в названии лог-файла можно использовать стандартные шаблоны (например *);
- J — сжимать лог-файл, используя bzip2;
- N — не предупреждать никакой процесс, о ротации лог-файла;
- W — если используются флаги Z или J, то newsyslog должен подождать, пока завершится процесс архивации;
- Z — сжимать лог, используя gzip.
-
[/pid_file]
– необязательный параметр, определяющий путь к файлу, в котором хранитсяPID
процесса приложения, работающего с данным логом. Если он указан, то приложение будет оповещено о ротации посылкой сигнала, на что оно должно произвести соответствующие действия со своей стороны; [sig_num]
– необязательный параметр, определяющий номер сигнала, посылаемый приложению при ротации, чтобы произошло переоткрытие нового лог-файла для записи. По умолчанию используетсяSIGHUP
, т. е. «1» (в обычных случаях посылается с помощьюkill -1
илиkill -HUP
). Некоторые демоны для переоткрытия лог-файлов требуют другого номера сигнала, как например, дляnginx, php-fpm, sphinx
нуженSIGUSR1
, т. е. «30».
Проверим работу. Создадим лог файл
touch /var/log/test.log
Зададим размер файлу в 1 мегабайт:
truncate -s 1M /var/log/test.log
Проверим размер файла:
root@WEBSERVER1:/ # ls -hl /var/log/test.log -rw-r--r-- 1 root wheel 1.0M Dec 22 23:52 /var/log/test.log
Теперь настроим newsyslog:
echo '# TEST' >> /etc/newsyslog.conf echo '/var/log/test.log 600 7 1 * ZC' >>/etc/newsyslog.conf
Запустим newsyslog с ключом -n — в этом случае newsyslog не будет выполнять ротацию, а только отобразит действия
root@WEBSERVER1:/ # newsyslog -n /var/log/test.log <7Z>: trimming rm -f /var/log/test.log.7 rm -f /var/log/test.log.7.gz rm -f /var/log/test.log.7.bz2 rm -f /var/log/test.log.7.xz rm -f /var/log/test.log.6 rm -f /var/log/test.log.6.gz rm -f /var/log/test.log.6.bz2 rm -f /var/log/test.log.6.xz ln /var/log/test.log /var/log/test.log.0 touch /var/log/test.log.0 # Update mtime for 'when'-interval processing chmod 600 /var/log/test.log.0 Start new log... mktemp /var/log/test.log.zXXXXXX chmod 600 /var/log/test.log.zXXXXXX mv /var/log/test.log.zXXXXXX /var/log/test.log Compress all rotated log file(s)... gzip /var/log/test.log.0 chmod 600 /var/log/test.log.0.gz root@WEBSERVER1:/ #
Теперь запустим в режиме verbose, это подробный режим, который даст нам больше информации о работе сервиса:
root@WEBSERVER1:/ # newsyslog -v Processing /etc/newsyslog.conf Found: <include> /etc/newsyslog.conf.d/* Found: <include> /usr/local/etc/newsyslog.conf.d/* /var/log/all.log <7J>: does not exist, skipped. /var/log/amd.log <7J>: does not exist, skipped. /var/log/auth.log <7J>: --> will trim at Wed Jan 1 00:00:00 2020 /var/log/console.log <5J>: does not exist, skipped. /var/log/cron <3J>: size (Kb): 61 [100] --> skipping /var/log/daily.log <7J>: does not exist, skipped. /var/log/debug.log <7J>: size (Kb): 1 [100] --> skipping /var/log/init.log <3J>: does not exist, skipped. /var/log/kerberos.log <7J>: does not exist, skipped. /var/log/lpd-errs <7J>: size (Kb): 1 [100] --> skipping /var/log/maillog <7J>: --> time is up --> trimming log.... /var/log/messages <5J>: --> will trim at Wed Jan 1 00:00:00 2020 /var/log/monthly.log <12J>: does not exist, skipped. /var/log/pflog <3J>: size (Kb): 1 [100] --> skipping /var/log/ppp.log <3J>: size (Kb): 1 [100] --> skipping /var/log/devd.log <3J>: size (Kb): 1 [100] --> skipping /var/log/security <10J>: size (Kb): 1 [100] --> skipping /var/log/sendmail.st <10>: age (hr): 26 [168] --> skipping /var/log/utx.log <3>: --> will trim at Wed Jan 1 05:00:00 2020 /var/log/weekly.log <5J>: does not exist, skipped. /var/log/xferlog <7J>: size (Kb): 1 [100] --> skipping /var/log/fail2ban.log <7J>: size (Kb): 6 [200] --> skipping /var/log/test.log <7Z>: size (Kb): 1 [1] --> trimming log.... Signal all daemon process(es)... Notified daemon pid 431 = /var/run/syslog.pid Pause 10 seconds to allow daemon(s) to close log file(s) Compress all rotated log file(s)... root@WEBSERVER1:/ #
Проверим файл после ротации:
root@WEBSERVER1:/ # ls -hl /var/log/test.log -rw------- 1 root wheel 73B Dec 23 00:00 /var/log/test.log root@WEBSERVER1:/ #
как видим файл изменился в размере, все работает.
В завершении, приведу пару примеров настройки для различных сервисов.
echo '# FAIL2BAN' >> /etc/newsyslog.conf echo '/var/log/fail2ban.log 600 7 200 * JC' >>/etc/newsyslog.conf
echo '# Apache' >> /etc/newsyslog.conf echo '/var/log/httpd-access.log www:wheel 600 10 200 * JC /var/run/httpd.pid 30' >>/etc/newsyslog.conf echo '/var/log/httpd-error.log www:wheel 600 10 200 * JC /var/run/httpd.pid 30' >>/etc/newsyslog.conf
echo '# Nginx logs' >> /etc/newsyslog.conf echo '/var/log/nginx/*.log root:wheel 644 20 5000 * GZ /var/run/nginx.pid 30' >> /etc/newsyslog.conf
Вот что получается в конце конфига:
# FAIL2BAN /var/log/fail2ban.log 600 7 200 * JC # Apache /var/log/httpd-access.log www:wheel 600 10 200 * JC /var/run/httpd.pid 30 /var/log/httpd-error.log www:wheel 600 10 200 * JC /var/run/httpd.pid 30 # Nginx logs var/log/nginx/*.log root:wheel 644 20 5000 * GZ /var/run/nginx.pid 30 # rsyncd.log /var/log/rsyncd.log 600 2 500 * ZC # named-auth.log /var/log/named-auth.log bind:bind 600 2 500 * ZC
Ещё примеры:
# Nginx logs /var/log/nginx/*.log root:wheel 644 20 5000 * GZ /var/run/nginx.pid 30 # php-fpm logs /var/log/php-fpm.log www:www 644 3 * @T00 JC /var/run/php-fpm.pid # redis logs /var/log/redis/redis.log redis:redis 644 5 * * CZN # rsync server logs /var/log/rsyncd.log 600 2 500 * ZC
Свежие комментарии