Fornex
Европейский
хостинг

    Logrotate - это системная утилита, которая управляет автоматической ротацией и сжатием лог-файлов. Если в процессе длительной работы сервера файлы не были ротированы, сжаты и периодически не удалялись, то рано или поздно они могут занять весь доступный объем памяти.

    Logrotate устанавливается по умолчанию на Debian 9 и настроена для обработки ротации журналов для всех установленных пакетов и приложений.

    Проверка версии Logrotate:

    logrotate --version  
    

    Вывод команды будет таким:

    root@kvmde67-19464:~# logrotate --version  
    logrotate 3.11.0  
    

    Стандартная конфигурация Logrotate хранится по двум путям:

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

    Рассмотрим конфигурационный файл Logrotate /etc/logrotate.d для пакетного менеджера apt:

    cat /etc/logrotate.d/apt  
    

    Вывод команды будет таким:

    root@kvmde67-19464:~# cat /etc/logrotate.d/apt  
    /var/log/apt/term.log {
      rotate 12
      monthly
      compress
      missingok
      notifempty
    }
    
    /var/log/apt/history.log {
      rotate 12
      monthly
      compress
      missingok
      notifempty
    }
    

    Этот файл содержит конфигурационные блоки для двух разных файлов журнала в каталоге /var/log/apt/: term.log и history.log. Оба блока имеют одинаковые опции. Любые параметры, не заданные в этих конфигурационных блоках, наследуют значения по умолчанию или значения, установленные в файле /etc/logrotate.conf.

    Параметры, установленные для журналов apt:

    • rotate 12 - указывает, что утилита сохраняет последние двенадцать логов;
    • monthly - обновлять один раз в месяц;
    • compress - команда архивирования, по умолчанию используется стандартная утилита Linux-систем – gzip, если же требуется изменить на другую, то указываем ключи после команды;
    • missingok - не записывать сообщение об ошибке, если лог-файл отсутствует;
    • notifempty - не ротировать пустой лог-файл.

    Для управления файлами журналов для приложений можно использовать два варианта:

    • Создать новый файл конфигурации Logrotate и поместить его в каталог /etc/logrotate.d/. Он будет работать ежедневно, как пользователь root вместе со всеми другими стандартными заданиями LogRotate.
    • Создать новый конфигурационный файл и запустить его с настройками LogRotate по умолчанию в Debian.

    Создание конфигурации в /etc/logrotate.d/

    В качестве примера настроим обновления для сервера, который пишет логи в файлы access.log и error.log, расположенные в каталоге /var/log/app/.

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

    nano /etc/logrotate.d/app  
    
    /var/log/example-app/*.log {
        daily
        missingok
        rotate 14
        compress
        notifempty
        create 0640 www-data www-data
        sharedscripts
        postrotate
            systemctl reload example-app
        endscript
    }
    

    Описание директив:

    • create 0640 www-data www-data - данная команда создаст новый пустой файл журнала после ротации с заданными разрешениями (0640), владелец ( www-data) и группы (www-data);
    • sharedscripts - эта опция означает, что любые скрипты, добавленные в конфигурацию, выполняются только один раз за запуск после сжатия файлов, а не для каждого отдельного обновленного файла. Поскольку наша конфигурация будет соответствовать двум лог-файлам (access.log и error.log), скрипт, указанный в postrotate, будет запускаться только 1 раз;
    • postrotate to endscript - скрипт в этом блоке будет запущен после того, как файл журнала обновится. В примере приложение перезагружается.

    После настройки конфигурации в соответствии с требованиями, можно выполнить тестирование с помощью команды:

    sudo logrotate /etc/logrotate.conf --debug  
    
    root@kvmde67-19464:~# logrotate /etc/logrotate.conf --debug  
    reading config file /etc/logrotate.conf  
    including /etc/logrotate.d  
    reading config file app  
    error: app:13 lines must begin with a keyword or a filename (possibly in double quotes)  
    reading config file apt  
    reading config file dpkg  
    reading config file rsyslog  
    Reading state from file: /var/lib/logrotate/status  
    Allocating hash table for state file, size 64 entries  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    Creating new state  
    
    Handling 9 logs  
    
    rotating pattern: /var/log/example-app/*.log  after 1 days (14 rotations)  
    empty log files are not rotated, old logs are removed  
    No logs found. Rotation not needed.  
    
    rotating pattern: /var/log/apt/term.log  monthly (12 rotations)  
    empty log files are not rotated, old logs are removed  
    considering log /var/log/apt/term.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not month ago yet)
    
    rotating pattern: /var/log/apt/history.log  monthly (12 rotations)  
    empty log files are not rotated, old logs are removed  
    considering log /var/log/apt/history.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not month ago yet)
    
    rotating pattern: /var/log/dpkg.log  monthly (12 rotations)  
    empty log files are not rotated, old logs are removed  
    considering log /var/log/dpkg.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not month ago yet)
    
    rotating pattern: /var/log/alternatives.log  monthly (12 rotations)  
    empty log files are not rotated, old logs are removed  
    considering log /var/log/alternatives.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not month ago yet)
    
    rotating pattern: /var/log/syslog  
     after 1 days (7 rotations)
    empty log files are not rotated, old logs are removed  
    considering log /var/log/syslog  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not day ago yet)
    
    rotating pattern: /var/log/mail.info  
    /var/log/mail.warn
    /var/log/mail.err
    /var/log/mail.log
    /var/log/daemon.log
    /var/log/kern.log
    /var/log/auth.log
    /var/log/user.log
    /var/log/lpr.log
    /var/log/cron.log
    /var/log/debug
    /var/log/messages
     weekly (4 rotations)
    empty log files are not rotated, old logs are removed  
    considering log /var/log/mail.info  
      log /var/log/mail.info does not exist -- skipping
    considering log /var/log/mail.warn  
      log /var/log/mail.warn does not exist -- skipping
    considering log /var/log/mail.err  
      log /var/log/mail.err does not exist -- skipping
    considering log /var/log/mail.log  
      log /var/log/mail.log does not exist -- skipping
    considering log /var/log/daemon.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not week ago yet)
    considering log /var/log/kern.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not week ago yet)
    considering log /var/log/auth.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not week ago yet)
    considering log /var/log/user.log  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not week ago yet)
    considering log /var/log/lpr.log  
      log /var/log/lpr.log does not exist -- skipping
    considering log /var/log/cron.log  
      log /var/log/cron.log does not exist -- skipping
    considering log /var/log/debug  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not week ago yet)
    considering log /var/log/messages  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not week ago yet)
    not running postrotate script, since no logs were rotated  
    
    rotating pattern: /var/log/wtmp  monthly (1 rotations)  
    empty log files are rotated, old logs are removed  
    considering log /var/log/wtmp  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not month ago yet)
    
    rotating pattern: /var/log/btmp  monthly (1 rotations)  
    empty log files are rotated, old logs are removed  
    considering log /var/log/btmp  
      Now: 2020-05-21 16:52
      Last rotated at 2020-05-21 06:00
      log does not need rotating (log has been rotated at 2020-5-21 6:0, that is not month ago yet)
    

    В результате будет вызвана утилита logrotate, с указанием на стандартный файл конфигурации в режиме отладки.
    В консоль будет выводиться информация, о том какие файлы logrotate обрабатывает в данный момент. Стандартная настройка Logrotate будет выполняться один раз в день, включая новую конфигурацию.

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

    В этом примере мы имеем приложение, которое работает под пользователем testing, генерация журналов, которые хранятся в каталоге /home/testing/logs/. Нам нужно сделать ротацию этих журналов ежечасно, поэтому мы должны установить его за пределами структуры /etc/logrotate.d, представленной в Debian.

    Создадим через текстовый редактор конфигурационный файл в нашем каталоге.

    nano /home/testing/logrotate.conf  
    

    Затем вставьте следующую конфигурацию:

    /home/testing/logrotate.conf
    /home/testing/logs/*.log {
        hourly
        missingok
        rotate 24
        compress
        create
    }
    

    file

    Сохраните и закройте файл.

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

    Необходимо настроить конфигурацию в соответствии с вашим приложением.

    Сделаем файл журнала чтобы проверить, что он работает:

    cd ~  
    
    mkdir logs  
    
    touch logs/access.log  
    

    Поскольку журналы принадлежат testing нам не нужно использовать sudo. Однако нам нужно указать файл состояния. Этот файл записывает, что logrotate видел и сделал в прошлый раз, так что он знает, что делать при следующем запуске.

    Мы попросим Logrotate поместить файл состояния прямо в наш домашний каталог для этого примера. Мы можем указать где угодно, что доступно и удобно:

    logrotate /home/testing/logrotate.conf --state /home/testing/logrotate-state --verbose --force  
    

    Вывод

    reading config file /home/testing/logrotate.conf  
    
    Handling 1 logs  
    
    rotating pattern: /home/testing/logs/*.log  hourly (24 rotations)  
    empty log files are rotated, old logs are removed  
    considering log /home/testing/logs/access.log  
      log does not need rotating
    
    

    –verbose распечатает подробную информацию о том, что делает Logrotate. Это первый раз, когда LogRotate видит этот файл журнала, так, насколько это известно, файлу ноль часов, и к нему не должно быть применена ротация.

    Если мы посмотрим на файл состояния, мы увидим, что Logrotate записал информацию о запуске:

    cat /home/testing/logrotate-state  
    

    Вывод

    root@kvmde67-19464:~# cat /home/testing/logrotate-state  
    logrotate state -- version 2  
    
    

    Logrotate отметил, что он видел журналы, и когда он последний раз рассматривал их вращение. Если запустить эту же команду, один час спустя, журнал будет повернут, как ожидалось.

    Если вы хотите заставить LogRotate производить ротацию файла журнала, тогда надо использовать флаг –force:

    logrotate /home/testing/logrotate.conf --state /home/testing/logrotate-state --verbose --force  
    

    Далее, нужно настроить задание cron для запуска Logrotate каждый час. Откройте crontab пользователя:

    crontab -e  
    

    Откроется текстовый файл. Возможно, в файле уже есть некоторые комментарии, объясняющие ожидаемый основной синтаксис.
    Переместите курсор на новую пустую строку в конец файла и добавьте следующее:

    14 * * * * /usr/sbin/logrotate /home/testing/logrotate.conf --state /home/testing/logrotate-state  
    

    file

    Эта задача будет выполняться на 14 – й минуте каждого часа, каждый день.