logrotate: настройка ротации логов

logrotate: настройка ротации логовlogrotate — это программа ротации логов, позволяющая сохранять в отдельный файл логи за определенный период времени или разделить лог на части определенного размера. Logrotate позволяет очень гибко работать с логами, имея при этом простые и понятные конфигурационные файлы. Кроме этого, логи можно автоматически сжимать и информировать по почте о ротации с отсылкой свежего лога, либо последнего, который удален при последней ротации. В данный момент logrotate является самой распространенной системой ротации логов, поскольку широко используется в операционных системах на базе ядра linux, которые доминируют в сфере серверов по всему миру.

Конфигурация logrotate

Конфигурация logrotate разделена на части. Основная часть обычно хранится в файле /etc/logrotate.conf. В этом файле могут присутствовать секции для ротации логов, а также директива «include /etc/logrotate.d», подключающая конфигурационные файлы из директории /etc/logrotate.d. Таким образом, для создания нового задания ротации вам достаточно создать конфигурационный файл и поместить его в эту директорию. Название файла желательно задавать такое же, как и название сервиса, логи которого будут ротироваться.

Вот пример конфигурационного файла /etc/logrotate.conf:

# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

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

Каждый файл в директории /etc/logrotate.d может включать одну или несколько секций. Каждая секция выглядит в общем виде так:

название-файла-лога {
    параметры
    ротации
}

Параметры ротации — это именно то, что обеспечивает гибкость ротации. У logrotate достаточно много опций, но их можно разбить на несколько групп. Вот опции, которые могут быть использованы в конфигурационных файлах:

Опции, определяющие интервал ротации:

hourly
daily
weekly
monthly
yearly
Ротировать файл лога каждый час, каждый день, каждую неделю, каждый месяц, каждый год. Запуск ротации обеспечивается обычно при помощи ежедневного запуска cron (файл /etc/cron.daily/logrotate), поэтому, если вам необходимо запускать ротацию каждый час, необходимо перенастроить запуск на запуск каждый час.

Опции сжатия логов:

compress Сжимать логи при ротации. По умолчанию для сжатия используется gzip
compresscmd Команда/программа, которая будет использоваться для сжатия логов
compressoptions Опции команды ротации, которые будут использоваться при сжатии логов
uncompresscmd Команда разархивации логов. По умолчанию gunzip
compressext Указать расширение файлов, которое будет указываться для сжатых логов
delaycompress Отложить сжатие лога до следующей ротации. Таким образом последняя версия лога после ротации будет несжатой, а более ранние — сжатыми
nocompress Не сжимать логи при ротации
nodelaycompress Не откладывать сжатие до следующей итерации ротации. Эта опция перегружает опцию delaycompress

Опции копирования:

copy Копировать лог-файл, но не изменять оригинал. Эту опцию можно использовать, когда надо создать снимок лога на определенный момент, вместо ротации, либо когда для усечения лога используется внешняя программа. Если используется опция copy, то опция create, если она указана, не будет иметь никакого эффекта, так как старый лог остается.
copytruncate Урезать оригинальный файл до нулевого размера после создания копии вместо переименования оригинального файла и создания нового. Эта опция используется тогда, когда программе, записывающей лог, нельзя указать, что нужно закрыть связанный с файлом лога дескриптор и открыть новый. Такая программа может продолжать писать в старый файл. При использовании этой опции есть один момент, связанный с тем, что на копирование требуется некоторое время и поэтому файл не может быть скопирован мгновенно. За время копирования в лог могут быть добавлены записи, которые будут утеряны при усечении файла до нулевого размера. При использовании этой опции опция create также не будет иметь эффекта, так как старый файл остается на месте
nocopy Не копировать оригинальный лог-файл. Эта опция перегружает опцию copy
nocopytruncate Не усекать оригинальный лог-файл после создания копии. Эта опция перегружает опцию copytruncate

Опции создания нового лог-файла (после ротации старого):

create права владелец группа
create владелец группа
Указать права доступа, владельца и группу владения нового свежесоздаваемого лог-файла сразу после его создания. Как уже упоминалось, если используются опции copy и copytruncate, то create не имеет смысла, так как старый файл остается на месте, новый файл не создается. Чтобы опция create отработала, файл должен отсутствовать. Права указываются восьмеричными значениями в таком же виде, как и при использовании программы chmod. Например, 644 или 600. Если какое-то значение (права/владелец/группа) опущено, то оно будет таким же, как у оригинального файла
nocreate Новые лог-файлы не создаются. Эта опция перегружает опцию create

Опции, связанные с удалением файла лога:

shred Удалять лог-файл при помощи программы команды «shred -u». По умолчанию используется unlink
shredcycles количество Указать количество циклов перезаписи содержимого файла до его удаления. Если опция не указана, будет использовано значение по умолчанию
noshred Не использовать shred для удаления
maxage количество Удалять файлы логов, которые старше, чем указанное количество дней. Возраст файлов проверяется только когда происходит ротация. Файлы высылаются по электронной почте на сконфигурированный адрес, если указаны опции mail и maillast

Опции, связанные с датами:

dateext Использовать в названии старых лог-файлов дату вместо номера. При использовании номера названия выглядят так: logfile.1.gz, logfile.2.gz и так далее
nodateext Не использовать дату в названиях старых лог-файлов. Эта опция перегружает опцию dateext
dateformat форматная-строка Указать форматную строку для даты, которая будет добавляться к названию лога. Форматная строка похожа на используемую в команде date, но допустимы только шаблоны %Y(четырехзначный номер года), %m(двузначный номер месяца), %d(двузначный номер дня месяца) и %s(unix time, количество секунд с 00:00 01.01.1970). Значение по умолчанию «-%Y%m%d», минус также включен в шаблон, при задании шаблона его можно упустить. Нужно отметить, что logrotate использует сортировку для определения более старых файлов, которые необходимо удалить, поэтому строка даты должна учитывать корректную сортировку. Именно поэтому вначале пишется обычно год, затем месяц и только затем день.
dateyesterday Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива

Опции, связанные с рассылкой логов:

mail адрес Указать адрес, на который будет выслан старый лог после ротации
nomail Не отправлять старые логи по электронной почте.
mailfirst Отправлять самый свежий файл после ротации
maillast Отправлять самый старый файл после ротации. Этот вариант используется по умолчанию

Опции, связанные с размером и существованием файла лога:

maxsize размер Лог ротируется, когда его размер превысит указанный, еще до наступления следующего интервала ротации (daily, weekly, monthly, yearly). Поскольку такая ротация не зависит от времени, поэтому использовать в названии файла дату не имеет смысла.
minsize размер Лог ротируется, когда его размер больше указанного, но не ранее, чем наступает соответствующий временной интервал ротации (daily, weekly, monthly, yearly)
size размер Лог ротируется, когда его размер больше указанного количества байт. Если после размера указана буква k, размер считается в килобайтах, если M — в мегабайтах, если G — в гигабайтах. Например, 1G или 10M.
ifempty Ротировать файл лога, даже если он пуст. Используется по умолчанию.
notifempty Не ротировать файл лога, если он пуст. Перегружает опцию ifempty.
missingok Если файл лога отсутствует, перейти к следующему без сообщения об ошибке
nomissingok Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию.

Опции, связанные с директориями, в которых хранятся логи:

olddir директория Директория, в которую будут перемещаться логи при ротации. Эта директория должна находиться на том же устройстве, что и ротируемый файл лога. Путь к директории можно указывать как абсолютный, так и без полного пути. Во втором случае он будет считаться поддиректорией директории, в которой хранится оригинальный файл лога. Когда эта опция указана, все старые версии логов попадают в эту директорию. Опция может быть перегружена опцией noolddir
noolddir Логи ротируются в той же директории, где находится оригинальный файл

Файлы настроек для logrotate позволяют выполнять скрипты в процессе ротации логов. Таким образом можно выполнить какие-то действия на каждом этапе ротации.

Опции выполнения скриптов:

postrotate/endscript Строки, находящиеся между словами postrotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh после ротации файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов. Таким образом можно выполнить скрипт для всех файлов сразу
prerotate/endscript Строки, находящиеся между словами prerotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед ротацией файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов.
sharedscripts В обычном режиме скрипты выполняются по одному разу на каждый файл, указанный для ротации. Таким образом скрипты могут быть выполнены несколько раз, по разу для каждого файла, указанного для ротации. Если указана директива sharedscripts, то скрипты выполняются по одному разу, но в качестве аргументов им передается список файлов. Если же ни один файл лога не ротируется, скрипты выполнены не будут. Если в процессе выполнения скрипта возникнет ошибка, то действие не будет завершено для всех логов.
nosharedscripts Запускать prerotate и postrotate скрипты для каждого лога, который ротируется. Это значение по умолчанию, кроме того, эта директива перегружает sharedscripts. Скриптам передается абсолютный путь к файлам логов. Если во время выполнения скрипта возникнет ошибка, то действие не будет завершено только для одного текущего файла лога.
preremove/endscript Строки, находящиеся между словами preremove и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед удалением старого файла лога. logrotate передаст название файла, который будет удален, скрипту в качестве аргумента
firstaction/endscript Строки, находящиеся между словами firstaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз до того, как лог-файлы будут ротированы и еще до того, как будет выполнена секция prerotate. Это произойдет только в том случае, если хотя бы один лог-файл будет действительно ротироваться. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.
lastaction/endscript Строки, находящиеся между словами lastaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз только после того, как лог-файлы будут ротированы и даже после того, как будет выполнена секция postrotate. Это произойдет только в том случае, если хотя бы один лог-файл ротирован. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.

Опции общего назначения:

extention расширение Лог-файлы с указанным расширением могут сохранять его после ротации. Если используется компрессия, то расширение с типом архива (обычно .gz) появляется после расширения. Например, если у вас файл лога называется mylog.foo и вы хотите получить при ротации файл mylog.1.foo.gz, а не mylog.foo.1.gz
rotate количество Лог-файлы ротируются указанное количество раз до удаления или отправки на адрес, указанный в директиве mail. Если количество равно 0, старые версии просто удаляются вместо ротации.
start номер Указать номер, используемый как база для нумерации при ротации. Например, если вы указываете 0, то оригинальный файл будет ротироваться в файл с окончанием .0, и далее по увеличению, если указать 9, то нумерация начнется с .9. Файлы в любом случае будут ротироваться такое количество раз, которое указано в директиве count.
su пользователь группа Выполнять ротацию логов под указанным пользователем и группой вместо пользователя по умолчанию (обычно root). Если у пользователи или группы недостаточно прав для осуществления ротации, возникнет ошибка.
include файл-или-директория logrotate считывает указанный файл и вставляет его как есть в конфигурационный файл в место вставки директивы include. Если указана директория, файлы из нее сортируются по алфавиту и затем вставляются в конфигурацию. При этом, если файлы не являются обычными файлами, они игнорируются. Это могут быть, например, именованные пайпы или директории. Также игнорируются файлы, имеющие расширения, указанные в директории tabooext.
tabooext [+] список Изменение текущего списка игнорируемых расширений. Если перед списком стоит +, то текущий список дополняется указанным. Если + не указан, то список заменяется. По умолчанию список изначально включает следующие расширения: .rpmsave, .rpmorig, ~, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf-new, .rpmnew, .swp, .cfsaved, .rhn-cfg-tmp-*

И напоследок простой пример.

/var/log/mydaemon/mydaemon.log /var/log/mydaemon/error.log{
    # Ежедневная ротация
    daily
    # Начинать нумерацию с 0
    start 0
    # Ротировать 30 раз до удаления
    rotate 30
    # Не генерировать ошибку, если файла лога нет
    missingok
    # Удалять логи при помощи команды shred
    shred
    # Делать 3 цикла перезаписи
    shredcycles 3
    # Отложить сжатие последнего лога
    delaycompress
    # Выполнять postrotate только один раз
    sharedscripts
    # После ротации послать программе сигнал SIGHUP, в результате чего
    # будут переоткрыты дескрипторы логов
    # (многие программы поддерживают такое поведение)
    postrotate
        kill -SIGHUP $(cat /var/run/mydaemon.pid)
    endscript
}

Если вы раньше не пользовались программой logrotate или пользовались, но никогда не настраивали тонко под себя, надеюсь эта информация вам поможет.

 

logrotate: настройка ротации логов: 16 комментариев

  1. Виктор

    Спасибо большое за статью, не подскажите как разгроничить или убрать логирование для определённой группы пользователей……?

    1. mnorin Автор записи

      Можно пример, а то я не очень понял, о чем речь?

      1. Виктор

        есть две группы пользователей
        acl first src 0.0.0.0 — c опеределлённым ip
        acl second src 1.1.1.1 — что б, эта группа не логировалась….

        а логи велись только для первой группы…..

        1. mnorin Автор записи

          Выглядит как часть конфига squid’а.
          Для него можно указать как-то так:

          acl first src 0.0.0.0
          acl second src 1.1.1.1
          access_log none second
          access_log /var/log/squid/access.log common first

          Можно одну из двух строчек с access_log оставить.
          Но к ротации логов это отношения не имеет.

          1. Виктор

            Спасибо большое за ответ!!! очень признателен…!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  2. Александр

    Добрый день, и с НГ!

    Вот вы пишите про ротацию логов, а по факту вы их ни как не фильтруете в примерах.

    Допустим у нас есть логи с nginx по 10 сообщ/с
    Из этого огромного «флуда» информации нужно вкл ротацию — хранить логи только с ошибками, а остальные удалять.
    У вас же «ротация» заключается лишь в том, чтобы задать вид сбора логово и их архивирование(хранение). Т.е. собрать логи за неделю и заархивировать, и снова продолжить собирать.

    Поясните может быть я не прав? Можно реализовать ротацию как в моем примере?

    1. Maxim Norin Автор записи

      Добрый день. И вас с Новым Годом.
      Сбор логов с архивацией более поздних и есть ротация. Само понятие ротации — это замена чего-то на следующее что-то. В контексте логов — замена файла, в котором уже есть данные, на пустой файл, в который логи будут писаться дальше.
      То, что вы описали, если я правильно понял задачу, реализуется отключением access-логов в конфиге nginx’а.
      Но более правильно будет поднять отдельный сервер с rsyslog’ом и включить в конфигах nginx’а передачу логов этому серверу. Это позволит в том числе хранить логи в одном месте и централизованно их анализировать, если нужна информация по трафику с нескольких серверов. Анализ также требует вычислительных мощностей, и это не будет аффектить работу веб-серверов.

      1. Александр

        Возможно я не правильно выразился. Давайте обрисую всю картинку, чтобы было понятно куда копать.

        У нас реализован централизованный сервер сбора логов GrayLog+Elasticshearch.

        Я на него получаю логи со всего, что движется в моей сети ( все сетевые устройства, от серверов, до датчика температуры или ИБП)

        Это достаточно больше кол-во хранимой информации.

        Задача настроить ротацию логов (как это представляет руководитель)

        Получать логи только избранные( например — кто авторизовался) и хранить их на сервере GrayLog 12 мес. А все остальные логи( включая и отфильтрованные) хранить 3 мес.

        1. Maxim Norin Автор записи

          Задача у вас скорее настроить фильтрацию логов в первую очередь, с чем отлично справляется rsyslog. Он позволяет их фильтровать по разным признакам и в зависимости от этого либо записывать в отдельные лог-файлы, либо отправлять на удаленный сервер. И потом уже ротировать сами полученные логи на сервере GrayLog.

  3. iskhakov

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

    1. Maxim Norin Автор записи

      Зайти по SSH на сервер. Для этого скачать программу PuTTY. После входа по SSH на сервер использовать текстовый редактор, nano, например.

      1. iskhakov

        спасибо, просто у меня на сервере каждый день забивается примерно 10-20 мб в сутки.
        Вот данные root, ротация идет? логи очищены?
        ———————————————-
        [root@server ~]# df -h
        Filesystem Size Used Avail Use% Mounted on
        /dev/vda1 9.9G 9.1G 311M 97% /
        tmpfs 248M 0 248M 0% /dev/shm
        [root@server ~]#
        —————————————
        [root@server ~]# du -sh /*
        8.0K /aquota.group
        8.0K /aquota.user
        0 /backup
        4.0K /base
        6.9M /bin
        22M /boot
        164K /dev
        8.2M /etc
        7.8G /home
        76M /lib
        19M /lib64
        16K /lost+found
        4.0K /media
        4.0K /mnt
        4.0K /opt
        du: cannot access `/proc/25020/task/25020/fd/4′: No such file or directory
        du: cannot access `/proc/25020/task/25020/fdinfo/4′: No such file or directory
        du: cannot access `/proc/25020/fd/3′: No such file or directory
        du: cannot access `/proc/25020/fdinfo/3′: No such file or directory
        0 /proc
        140K /root
        8.5M /sbin
        4.0K /selinux
        4.0K /srv
        0 /sys
        500K /tmp
        1.1G /usr
        145M /var
        [root@server ~]#
        ——————————————

        1. Maxim Norin Автор записи

          К сожалению, по этим данным нельзя ответить на эти вопросы.
          Можете прислать вывод команды ls -l /var/log ?

  4. vlad

    После ротации, получаю файл logfile.log и ligfile.log.1 вроде всё как задумано. Но, некоторые демоны продолжают писать во второй файл, при этом первый остаётся пустым. Пока попробовал в postrotate записать systemctl kill -s SIGHUP service-name.service. Помогло, не знаю насколько это корректно. Как тоже самое сделать для python программы? Сами unit файлы я написал, а вот с логом такая неприятность.

    1. Maxim Norin Автор записи

      Да, это вполне нормально посылать SIGHUP при ротации.
      Для Python-программы можно воспользоваться https://docs.python.org/3.5/library/syslog.html
      Это позволит не писать файл лога напрямую, и тогда не надо будет ничего делать с самой программой.

  5. Sergey

    Добрый день. Спасибо за статью.
    Подскажите как можно запускать ротацию определенных логов в определенное время.. Например мне нужно что-бы ротация для логов squid-а (и только) проходила в 3:00 каждый день не зависимо от их размера.

Обсуждение закрыто.