Использование logrotate для настройки ротации логов

Утилита logrotate предназначена для управления лог-файлами во избежание увеличения их размеров. Например, она позволяет настроить сжатие, удаление и отправку лог-файлов на другой сервер при достижении заданных условий. Более подробная информация приведена на странице репозитория logrotate.

Частота проверки условий лог-файлов может принимать следующие значения:

  • hourly — каждый час;

  • daily — каждый день;

  • weekly — каждую неделю;

  • monthly — каждый месяц;

  • yearly — каждый год.

По умолчанию включена еженедельная проверка.

Конфигурация logrotate хранится:

  • в основном конфигурационном файле /etc/logrotate.conf, в котором заданы параметры по умолчанию;

  • в директории /etc/logrotate.d, в которой содержатся дополнительные файлы конфигураций.

Основные конфигурационные параметры

Основные параметры, которые могут быть использованы в файлах конфигураций, перечислены в таблице ниже.

Конфигурационные параметры
Параметр Описание

size <number>

Определяет размер лог-файла, при превышении которого выполняется ротация. Размер лог-файла может быть указан в КБ (k), МБ (М) или ГБ (G)

create <mode> <owner> <group>

Позволяет создать новый лог-файл с указанными разрешениями, пользователем и группой после ротации лог-файла

missingok

Позволяет перейти к следующему шагу при отсутствии указанного лог-файла, не выдавая сообщение об ошибке

nomail

Позволяет не отправлять архивированный ранее (ротируемый) лог-файл по электронной почте

notifempty

Позволяет не выполнять ротацию пустого лог-файла

rotate <count>

Определяет количество ротаций лог-файла, то есть количество архивированных лог-файлов. Например, при количестве ротаций, равном 0, архивированные ранее лог-файлы будут удалены

sharedscripts

Приводит к единоразовому выполнению скриптов, добавленных в файл конфигурации, независимо от количества лог-файлов, подходящих под указанный шаблон лог-файлов, например /var/log/news/*

postrotate <command> endscript

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

Установка и настройка logrotate

В зависимости от операционной системы и менеджера пакетов, которые вы используете, для установки и настройки logrotate выполните следующие шаги:

  1. Установите logrotate:

  • YUM

  • APT

$ sudo yum install logrotate
$ sudo apt install logrotate
  1. Добавьте в конфигурационный файл /etc/logrotate.conf следующие строки:

    • для включения дополнительных параметров из директории /etc/logrotate.d в конфигурационный файл:

      include /etc/logrotate.d
    • для добавления пользователя с правами root:

      # use the root group by default, since this is the owning group
      # of /var/log/syslog.
      su root root

      Файл может быть изменен с помощью редактора vi или vim:

      $ sudo vi /etc/logrotate.conf

      Содержимое обновленного файла logrotate.conf:

      # see "man logrotate" for details
      # rotate log files weekly
      weekly
      
      # use the root group by default, since this is the owning group
      # of /var/log/syslog.
      su root root
      
      # keep 4 weeks worth of backlogs
      rotate 4
      
      # create new (empty) log files after rotating old ones
      create
      
      # use date as a suffix of the rotated file
      dateext
      
      # uncomment this if you want your log files compressed
      #compress
      
      # RPM packages drop log rotation information into this directory
      include /etc/logrotate.d
      
      # no packages own wtmp and btmp -- we'll rotate them here
      /var/log/wtmp {
          monthly
          create 0664 root utmp
              minsize 1M
          rotate 1
      }
      
      /var/log/btmp {
          missingok
          monthly
          create 0600 root utmp
          rotate 1
      }
      
      # system-specific logs may be also be configured here.

Создание файла конфигурации

В качестве примера рассмотрим создание файлов конфигурации:

Чтобы добавить файл конфигурации в директорию /etc/logrotate.d:

  1. С помощью редактора vi или vim создайте файл конфигурации:

    • для Nginx:

      $ sudo vi /etc/logrotate.d/nginx
    • для статус-сервера:

      $ sudo vi /etc/logrotate.d/status-server
    • для бэкенд-сервера:

      $ sudo vi /etc/logrotate.d/audit
  2. Добавьте в созданный файл конфигурацию для ротации лог-файлов.

     
    Пример файла конфигурации nginx:

    /opt/adcm/log/nginx/*.log {
        su root root
        size 200M
        create 0644
        missingok
        nomail
        notifempty
        rotate 5
        sharedscripts
        postrotate
            docker exec -it adcm sh -c '/usr/sbin/nginx -s reopen'
        endscript
    }

    Здесь:

    • /opt/adcm/log/nginx/*.log — расположение лог-файлов с расширением .log, которые подлежат ротации.

    • size 200M — размер лог-файла, при достижении которого выполняется ротация.

    • create 0644 — создание нового лог-файла после ротации, который имеет разрешение 0644 (права на чтение и запись для владельца, право на чтение для группы и остальных пользователей).

    • rotate 5 — количество архивных лог-файлов, хранимых logrotate, при этом каждый лог-файл содержит события за период частоты ротации.

    • docker exec -it adcm sh -c '/usr/sbin/nginx -s reopen' — команда для повторного открытия исполняемых файлов Nginx в контейнере ADCM и записи событий Nginx в новый лог-файл.

     
    Пример файла конфигурации status-server:

    /opt/adcm/log/status.log {
        su root root
        size 200M
        create 0644
        missingok
        rotate 5
        sharedscripts
        postrotate
            docker exec -it adcm sh -c 'killall -USR1 runstatus'
        endscript
    }

    Здесь docker exec -it adcm sh -c 'killall -USR1 runstatus' — команда для отправки запущенным процессам сигнала USR1, чтобы закрыть архивированный ранее лог-файл и продолжить запись событий в новый лог-файл.

     
    Пример файла конфигурации audit:

    /opt/adcm/log/audit.log {
    size 1k
    create 0644
    missingok
    nomail
    rotate 7
    sharedscripts
    }
    ПРИМЕЧАНИЕ
    По аналогии можно создать файлы конфигураций для ротации лог-файлов adcm.log, adcm_debug.log, ldap.log и cron_task.log.

Проверка созданного файла конфигурации

После добавления файла в директорию /etc/logrotate.d проверьте работу logrotate путем вызова утилиты в режиме verbose, который позволяет получить подробную информацию о шагах, выполняемых logrotate:

$ sudo logrotate -v /etc/logrotate.d/nginx
Пример результата выполнения команды
reading config file /etc/logrotate.d/nginx
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /opt/adcm/log/nginx/*.log  10 bytes (5 rotations)
empty log files are not rotated, old logs are removed
considering log /opt/adcm/log/nginx/access.log
  log does not need rotating (log size is below the 'size' threshold)
considering log /opt/adcm/log/nginx/error.log
  log needs rotating
rotating log /opt/adcm/log/nginx/error.log, log->rotateCount is 5
dateext suffix '-20241002'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /opt/adcm/log/nginx/error.log.5 to /opt/adcm/log/nginx/error.log.6 (rotatecount 5, logstart 1, i 5),
old log /opt/adcm/log/nginx/error.log.5 does not exist
renaming /opt/adcm/log/nginx/error.log.4 to /opt/adcm/log/nginx/error.log.5 (rotatecount 5, logstart 1, i 4),
old log /opt/adcm/log/nginx/error.log.4 does not exist
renaming /opt/adcm/log/nginx/error.log.3 to /opt/adcm/log/nginx/error.log.4 (rotatecount 5, logstart 1, i 3),
old log /opt/adcm/log/nginx/error.log.3 does not exist
renaming /opt/adcm/log/nginx/error.log.2 to /opt/adcm/log/nginx/error.log.3 (rotatecount 5, logstart 1, i 2),
old log /opt/adcm/log/nginx/error.log.2 does not exist
renaming /opt/adcm/log/nginx/error.log.1 to /opt/adcm/log/nginx/error.log.2 (rotatecount 5, logstart 1, i 1),
old log /opt/adcm/log/nginx/error.log.1 does not exist
renaming /opt/adcm/log/nginx/error.log.0 to /opt/adcm/log/nginx/error.log.1 (rotatecount 5, logstart 1, i 0),
old log /opt/adcm/log/nginx/error.log.0 does not exist
log /opt/adcm/log/nginx/error.log.6 doesn't exist -- won't try to dispose of it
renaming /opt/adcm/log/nginx/error.log to /opt/adcm/log/nginx/error.log.1
creating new /opt/adcm/log/nginx/error.log mode = 0644 uid = 100 gid = 0
running postrotate script
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней