Настраиваем логи или ротация логов в FreeBSD

Print Friendly, PDF & Email

Задача:

Настроить ротацию логов при помощи newsyslog, для сервисов сервера

---------------------------------------------------------------

newsyslog – это сервис, предотвращающий бесконтрольный рост лог-файлов. Он осуществляет ротацию логов через заданный отрезок времени и удаляет ставшие ненужными старые файлы.

Если за ведение логов во FreeBSD отвечает демон  syslog, то их ротацией — newsyslog.

Если демон  syslog работает постоянно, и запускается при старте системы, то newsyslog работает при помощи cron.

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

Согласно стандартной настройки, ротация логов происходит раз в час

* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)

Настроить ротацию логов можно при помощи файла  /etc/newsyslog.conf:

# cat  /etc/newsyslog.conf
# configuration file for newsyslog
# $FreeBSD: releng/11.2/etc/newsyslog.conf 266463 2014-05-20 03:00:20Z bdrewery $
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated.  This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf).  If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'.
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# 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  @0101T 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/init.log                       644  3     100  *     J
/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  @0101T 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/devd.log                       644  3     100  *     JC
/var/log/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   BN
/var/log/utx.log                        644  3     *    @01T05 B
/var/log/weekly.log                     640  5     *    $W6D0 JN
/var/log/xferlog                        600  7     100  *     JC

<include> /etc/newsyslog.conf.d/*
<include> /usr/local/etc/newsyslog.conf.d/*
  • 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». 

Проверим работу. Создадим лог файл

touch /var/log/test.log

Зададим размер файлу в 1 мегабайт:

truncate -s 1M /var/log/test.log 

Проверим размер файла:

root@WEBSERVER1:/ # ls -hl /var/log/test.log
-rw-r--r--  1 root  wheel   1.0M Dec 22 23:52 /var/log/test.log

Теперь настроим newsyslog:

echo '# TEST' >> /etc/newsyslog.conf  
echo '/var/log/test.log                   600  7     1 *    ZC' >>/etc/newsyslog.conf  

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

root@WEBSERVER1:/ # newsyslog -n
/var/log/test.log <7Z>: trimming
        rm -f /var/log/test.log.7
        rm -f /var/log/test.log.7.gz
        rm -f /var/log/test.log.7.bz2
        rm -f /var/log/test.log.7.xz
        rm -f /var/log/test.log.6
        rm -f /var/log/test.log.6.gz
        rm -f /var/log/test.log.6.bz2
        rm -f /var/log/test.log.6.xz
        ln /var/log/test.log /var/log/test.log.0
        touch /var/log/test.log.0               # Update mtime for 'when'-interval processing
        chmod 600 /var/log/test.log.0
Start new log...
        mktemp /var/log/test.log.zXXXXXX
        chmod 600 /var/log/test.log.zXXXXXX
        mv /var/log/test.log.zXXXXXX /var/log/test.log
Compress all rotated log file(s)...
        gzip /var/log/test.log.0
        chmod 600 /var/log/test.log.0.gz
root@WEBSERVER1:/ #

Теперь запустим в режиме verbose, это подробный режим, который даст нам больше информации о работе сервиса:

root@WEBSERVER1:/ # newsyslog -v
Processing /etc/newsyslog.conf
Found: <include> /etc/newsyslog.conf.d/*
Found: <include> /usr/local/etc/newsyslog.conf.d/*
/var/log/all.log <7J>: does not exist, skipped.
/var/log/amd.log <7J>: does not exist, skipped.
/var/log/auth.log <7J>: --> will trim at Wed Jan  1 00:00:00 2020
/var/log/console.log <5J>: does not exist, skipped.
/var/log/cron <3J>: size (Kb): 61 [100] --> skipping
/var/log/daily.log <7J>: does not exist, skipped.
/var/log/debug.log <7J>: size (Kb): 1 [100] --> skipping
/var/log/init.log <3J>: does not exist, skipped.
/var/log/kerberos.log <7J>: does not exist, skipped.
/var/log/lpd-errs <7J>: size (Kb): 1 [100] --> skipping
/var/log/maillog <7J>: --> time is up
--> trimming log....
/var/log/messages <5J>: --> will trim at Wed Jan  1 00:00:00 2020
/var/log/monthly.log <12J>: does not exist, skipped.
/var/log/pflog <3J>: size (Kb): 1 [100] --> skipping
/var/log/ppp.log <3J>: size (Kb): 1 [100] --> skipping
/var/log/devd.log <3J>: size (Kb): 1 [100] --> skipping
/var/log/security <10J>: size (Kb): 1 [100] --> skipping
/var/log/sendmail.st <10>:  age (hr): 26 [168] --> skipping
/var/log/utx.log <3>: --> will trim at Wed Jan  1 05:00:00 2020
/var/log/weekly.log <5J>: does not exist, skipped.
/var/log/xferlog <7J>: size (Kb): 1 [100] --> skipping
/var/log/fail2ban.log <7J>: size (Kb): 6 [200] --> skipping
/var/log/test.log <7Z>: size (Kb): 1 [1] --> trimming log....
Signal all daemon process(es)...
Notified daemon pid 431 = /var/run/syslog.pid
Pause 10 seconds to allow daemon(s) to close log file(s)
Compress all rotated log file(s)...
root@WEBSERVER1:/ # 

Проверим файл после ротации:

root@WEBSERVER1:/ # ls -hl /var/log/test.log
-rw-------  1 root  wheel    73B Dec 23 00:00 /var/log/test.log
root@WEBSERVER1:/ #

как видим файл изменился в размере, все работает.

В завершении, приведу пару примеров настройки для различных сервисов.

echo '# FAIL2BAN' >> /etc/newsyslog.conf  
echo '/var/log/fail2ban.log                   600 7 200 * JC' >>/etc/newsyslog.conf  
echo '# Apache' >> /etc/newsyslog.conf  
echo '/var/log/httpd-access.log  www:wheel   600  10    200  *     JC      /var/run/httpd.pid 30' >>/etc/newsyslog.conf 
echo '/var/log/httpd-error.log   www:wheel   600  10    200  *     JC      /var/run/httpd.pid 30' >>/etc/newsyslog.conf 
echo '# Nginx logs' >> /etc/newsyslog.conf
echo '/var/log/nginx/*.log         root:wheel      644  20    5000  *     GZ   /var/run/nginx.pid 30' >> /etc/newsyslog.conf

Вот что получается в конце конфига:

# FAIL2BAN
/var/log/fail2ban.log                   600 7 200 * JC
# Apache  
/var/log/httpd-access.log  www:wheel   600  10    200  *     JC      /var/run/httpd.pid 30 
/var/log/httpd-error.log   www:wheel   600  10    200  *     JC      /var/run/httpd.pid 30
# Nginx logs
var/log/nginx/*.log         root:wheel      644  20    5000  *     GZ   /var/run/nginx.pid 30
# rsyncd.log
/var/log/rsyncd.log                     600  2     500  *     ZC
# named-auth.log
/var/log/named-auth.log bind:bind       600  2     500  *     ZC

Ещё примеры:

# Nginx logs
/var/log/nginx/*.log         root:wheel      644  20    5000  *     GZ   /var/run/nginx.pid 30
# php-fpm logs
/var/log/php-fpm.log         www:www         644  3     *     @T00  JC   /var/run/php-fpm.pid
# redis logs
/var/log/redis/redis.log     redis:redis     644  5     *     *     CZN
# rsync server logs
/var/log/rsyncd.log                     600  2     500  *     ZC
Помогла статья? Есть возможность отблагодарить автора

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *