Newsyslog Настраиваем логи или ротация логов в FreeBSD¶
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