Ротация логов FreeBSD (newsyslog)

 Началось все с того, что на одном из удаленных серверов отвалился bind, первое что я увидел после подключения, это что свободное место в разделе var стало отрицательным -

>df -h

Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    496M    215M    241M    47%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1e    496M     16K    456M     0%    /tmp
/dev/ad0s1f     33G    5.8G     24G    19%    /usr
/dev/ad0s1d    1.4G    1.4G    -47M   100%    /var
devfs                  1.0K    1.0K      0B   100%    /var/named/dev

Глянув на раздел var, все сразу стало понятно, размер логов snmp и freshclam вырос до безобразия.
Решение здесь в принципе одно - ротация логов. Изобретать велосипед не будет, а воспользуемся стандартным средством newsyslog. Согласно /etc/crontab, newsyslog запускается каждый час в 00 минут -

# 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
/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/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  *     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/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/xferlog                        600  7     100  *     JC

Разберем конфиг несколько подробнее, обратимся к man -
Русскоязычной страницы нет, поэтому приведу только краткое описание полей в собственном переводе =):

Описание:
 logfilename –  Имя системного лог-файла (полный путь) для архивации или одна из символьныйх строк ``<default>" или ``<include>".  Параметр "default" должно использоваться только если имя лог-файла задано как аргумент командной строки newsyslog и если это имя не используется в других строках конфигурационного файла. Параметр "include" используется для подключения других конфигурационных файлов и поддерживает подстановку.

owner:group  - необязательное (опциональное) поле владельца и группы файла, разделено двоеточием, двоеточие также ставиться если указан только один параметр (владелец или группа)    
mode - права выставляеме на файл в формате цифровом формате Unix (пример 777)
count  - Поле содержащее максимальное число создаваемых архивных файлов . В это число не входит сам лог-файл, отсчет начинается с нуля.

size - размер лог-файла. Когда размер лог-файла (килобайты) превышает заданный в этом поле, лог-файл подвергается ротации. Если поле содержит звездочку ("*"), лог-файл по размеру не сравнивается (то бишь допустим любой размер).

when - время запуска ротации, если содержит звездочку, то это поле не учитывается (любое время), а берется значение поля "size". Возможные форматы времени:
- число, например 12 (ротация будет происходить каждые 12 часов)
- формат iso 8601, поле начинается со знака "@" с буквой T посередине, которая отделяет дату от времени:

[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]].  

где,

ссyy - год
mm - месяц
dd - день
hh - час
mm - минуты
ss - секунды

Например - 17 ноября 2011 года 15:00

20111017T150000
111017T150000
1017T150000
17T150000
и т.д.
 
Следует учесть, что если задать только день, например 17T, то ротация будет выполняться каждый час 17-го числа каждого месяца.
- также в формате можно указать символ $, тогда формат принимает вид

[D hh ] [W w [D hh ] ] and [M dd [D hh ]

,где
hh - часы, в интервале 0..23
w  - день недели, в интервале 0..6, где 0 = Воскресенье
dd - день месяца, в интервале 1..31, или одно из написаний буквы `L' (или `l') для задания последнего дня месяца.

Примеры:
$D0 - ротация каждую ночь в полночь, также как и запись @T00
$D23 - ротация каждый день в  23:00, также как @T23
$W0D23 - ротация каждое воскресенье недели в 23-00
$W5D16 - ротация каждую пяцницу в 16-00
$M1D0 - ротация каждый первый день месяца в полночь, также как @01T00
$M5D6 - ротация каждый 5-й день месяца в 6-00, также как @05T06

flags - это опциональное (необязательное ) содержащее один или несколько символов характеризующих процесс ротации.

Разрешенне значения:

B - показвает, что лог-файл является двоичным. Обычно newsyslog добавляет ASCII сообщение в лог-файл в процессе. Это сообщение содержит запись когда и почему лог-файл подвергся перезаписи. Если установлен флаг B, то данное сообщение в лог не вносится.
             
C - указывает, создавать ли лог- файл, если он не существует, данный параметр можно также использовать в командной строке.

D - указывает newsyslog(8) установить флаг UF_NODUMP при создании новой версии этого лог-файла.

G - разрешает использовать в именах лог-файлов стандартные шаблоны (например *)

J - указывает newsyslog сжимать файлы перед записью с помоью bzip2

N - отключает необходимость  информировать процесс при ротации  лог-файла.

U - позволяет указать специфический  путь к pid-файлу содержащий ID группы процессов, вместо одного процесса.    

Z - указывает newsyslog(8) сжимать лог-файл gzip(1).

- - знак минуса не несет за собой сигналов обработки, но он может быть использован для создания поля флагов, при создании других дополнительных полей a

path_to_pid_file - Необязательное поле указывающее на ID демон-процесса или нахождения ID группы процесса, если установлен флаг U. Если это поле заполнено, номер сигнала (signal_number)  посылает ID процесса содержащегося в этом файле. Если поле не заполнено и не установлен флаг N, то посылается сигнал SIGHUP в syslogd или ищется ID процесса в файле описанном newsyslog -S switch. Это поле должно начинаться с /.          

signal_number - Необязательное поле, содержащее номер сигнала который будет послан  демон-процессу (или всем процессам находящимся в группе процесса, если установлен флаг U). Если поле пустое (не заполнено), то посылается сигнал SUGHUP.
Изучив man, добавляем недостающие лог-файлы в конфиг -       

        
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  *     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  4     100  *     JC
/var/log/kerberos.log                   600  4     100  *     J
/var/log/lpd-errs                       644  4     100  *     JC
/var/log/maillog                        640  4     *    @T00  JC
/var/log/messages                       644  3     100  *     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/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  3     *    168   B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/xferlog                        600  3     100  *     JC
/var/log/httpd-access.log               644  3     100  *     JC
/var/log/httpd-error.log                644  2     100  *     JC
/var/log/snmpd.log                      644  3     100  *     JC
/var/log/clamav/freshclam.log           644  2     1000 *     JC
/var/log/havp/access.log                644  2     100  *     JC
/var/log/havp/error.log                 644  2     100  *     JC
/var/log/openvpn/openvpn.log            644  2     1000 *     JC
/var/log/openvpn/openvpn-status.log     644  2     100  *     JC

Чтобы не ждать времени когда newsyslog запуститься по cron'у, запускаем вручную -

>newsyslog

И смотрим место на дисках.

df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    496M    215M    241M    47%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1e    496M     16K    456M     0%    /tmp
/dev/ad0s1f     33G    5.9G     24G    19%    /usr
/dev/ad0s1d    1.4G    750M    592M    56%    /var
devfs          1.0K    1.0K      0B   100%    /var/named/dev

Результат на лицо =)

Интересное на сайте: 
0
Голосов пока нет