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

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

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

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

    

1 # logfilename              mode count size when  flags

    

2 /var/log/all.log                        600  7     *    @T00  J

    

3 /var/log/amd.log                        644  7     100  *     J

    

4 /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.

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

   

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

 

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

    

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

 Проверим:

    

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

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

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

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

01 # newsyslog -n

 

02 /var/log/somesite.access.log <7Z>: trimming
03 rm -f /var/log/somesite.access.log.7

 

04 rm -f /var/log/somesite.access.log.7.gz
05 rm -f /var/log/somesite.access.log.7.bz2
06 rm -f /var/log/somesite.access.log.7.xz
07 ln /var/log/somesite.access.log /var/log/somesite.access.log.0
08 chmod 600 /var/log/somesite.access.log.0
09 Start new log...
10 mktemp /var/log/somesite.access.log.zXXXXXX
11 chmod 600 /var/log/somesite.access.log.zXXXXXX
12 mv /var/log/somesite.access.log.zXXXXXX /var/log/somesite.access.log
13 Signal all daemon process(es)...
14 kill -1 64569           # /var/run/syslog.pid
15 sleep 10

 

16 Compress all rotated log file(s)...

 

17 gzip /var/log/somesite.access.log.0

 

18 chmod 600 /var/log/somesite.access.log.0.gz

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

    

01 # newsyslog -v

    

02 Processing /etc/newsyslog.conf

 

03 /var/log/all.log <7J>: does not exist, skipped.

    

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

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

 

 

1 # ls -hl /var/log/ | grep somesite

 

2 -rw-------  1 root      wheel      74B Feb  1 13:00 somesite.access.log

 

--  1 root      wheel     148B Feb  1 13:00 somesite.access.log.0

 

4 -rw-------  1 root      wheel     144B Feb  1 12:58 somesite.access.log.1.gz

 Готово.

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