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