Если ведением логов занимается демон 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
обработает их в любом случае.