Ротация логов 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
Результат на лицо =)