Примеры настроек logrotate для различных программ

Настройка

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

Logrotate настройка имеет конфигурацию, хранящуюся по следующему адресу:

  • /etc/logrotate.conf — основной файл. Как правило, он содержит некоторые параметры предустановленные автоматически, настройки для ряда базовых журналов, не принадлежащим системным пакетам и инструкцию include для подключения конфигурации, хранящейся по адресу /etc/logrotate.d
  • /etc/logrotate.d содержит файлы с конфигурацией. Здесь logrotate настройка содержит конфигурацию для rsyslog, apport, dpkg и других системных пакетов. Каждый из них — конфигурация ротации. Вы сможете добавить свои файлы конфигурации в Linux журнал событий, они также будут обработаны утилитой.

Рассмотрим конфигурацию, предлагаемую утилитой logrotate Linux с целью ротации для apport — /etc/logrotate.d/apport:

/var/log/apport.log {
daily
rotate 7
delaycompress
compress
notifempty
missingok
}

Вот что означают такие данные:

  • daily — ротацию выполнять однажды в сутки (для редко используемых сервисов можно использовать команду monthly — раз каждый месяц или weekly — раз каждую неделю), удобно при необходимости проведения регулярного аудита.
  • rotate 7 — позволяет в автоматическом режиме хранить последние 7 журналов.
  • compress — используется для сжатия обновленного объема данных (стандартно используется технология gzip)
  • notifempty — запрещает ротировать файл, если он пустой.
  • missingok — не оставляет сообщение об ошибке в работе системы, если системные журналы Linux пусты.
  • delaycompress — позволяет на время отсрочить сжатие прошлого журнала до прохождения последующего сдвига по циклу. Эта директива успешно используется лишь в сочетании с compress. Это необходимо, если запущенной программе невозможно приказать сразу закрыть журнал и допускается определенный период времени продолжать вести запись в используемый для этого ранее файл.

Конечно, это далеко не все допустимые параметры конфигурации. О дополнительных вы можете узнать в справке (команда man logrotate) или по ссылке.

Если облака для вас
не просто теория

Широкий спектр услуг
по выделенным северам
и мультиклауд-решениям

Конфигурация VPS и бесплатный тест уже через 2 минуты

Сконфигурировать VPS

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

Запросить КП

Теперь представим, что у нас есть некий сервис daemond, хранящий свои файлы в каталоге /var/log/daemond. Нужно настроить ротацию этого сервиса.

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

Воссоздадим конфигурацию ротации:

touch /etc/logrotate.d/daemond

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

/var/log/daemond/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 daemon-datadaemon-data
sharedscripts
postrotate
systemctl reload daemond
endscript
}

Первая строчка задает требуемые файлы. Здесь это все лог-файлы из используемого каталога /var/log/daemond. С первыми пятью командами вы уже знакомы. Команда create определяет, что после ротации будет создан новый пустой файл с правами 0640, владельцем daemon-data и группой daemon-data

Если ваш сервис выполняется от имени какого-то пользователя (например, daemon-data), а не от root, то очень важно указать правильно имя пользователя и задать название группы.

Параметр sharedscripts говорит о том, что скрипт под названием postrotate будет выполняться только лишь 1 раз, а не непосредственно после детальной обработки любого имеющегося файла.

Параметры postrotate и endscript позволяют указать скрипт, который будет запущен только уже после того, как журнал полностью обновится. В указанном примере приложение перезагружается.

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

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 или пользовались, но никогда не настраивали тонко под себя, надеюсь эта информация вам поможет.

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

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. Это произойдет только в том случае, если хотя бы один лог-файл ротирован. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.

Настройка ротации log файлов (logrotate)

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

Установка Logrotate
Установка обычна для Debian / Ubuntu-based дистрибутивов:

Описание того, каким образом Logrotate будет работать с тем или иным лог файлом находится в специальном конфигурационном файле. Как правило, они располагаются в директории /etc/logrotate.d/. Например, файл конфигурации для apache2 выглядит следующим образом:

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

Допустимых директив в конфигурационном файле очень много (более 40). Подробнее о них можно узнать из man logrotate.

Основные опции Logrotate

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

  • -d. Включает режим отладки, а так же дублирует опцию -v. В режиме отладки никаких действий с логами не будет выполнено.
  • -f, —force. Заставляет logrotate выполнить ротацию логов. Бывает необходимо после добавления новых конфигурационных файлов или если старый лог файл был удалён вручную; таким образом будут созданы новые лог-файлы и журналирование будет корректно продолжено.
  • -m, —mail command. Указывает, какую команду использовать для отправки журналов по почте. Команда должна принимать 2 входных параметра:

    • заголовок письма
    • получателя письма

    После этого команда должна прочитать сообщение со стандартного входа (STDIN) и отправить его получателю. Командой по умолчанию является /usr/bin/mail -s

  • -s, —state statefile. Указывает на использование альтернативный файл состояния. Полезно в случаях, когда logrotate работает от имени разных пользователей для различных наборов лог-файлов. Дефолтный файл состояния: /var/lib/logrotate/status
  • —usage. Выводит краткую инструкцию по использованию утилиты.
  • -v, —verbose. Вывод диагностических сообщений во время ротации

Пример настройки Logrotate

В качестве примера допустим, что в директории /home/site/itworkroom.com/logs/ располагаются лог-файлы таких веб серверов, как nginx и apache. Работают они в связке: nginx — фронтенд, apache2-бэкенд.

Комментарии по ходу текста не должны оставить вопросов. Но в общем, схема такова, что отдельно ротируются логи nginx, отдельно логи apache2. При этом, так как nginx является front-end’ом и его лог наполняется интенсивнее, чем у apache, то он (лог nginx) ротируется в 7 раз чаще, чем лог apache2.

Кроме того, при каждой итерации ротирования логов nginx выполняется сбор статистики посещений AWstats

После того, как конфигурационный файл создан, необходимо убедиться, что все будет работать именно так, как и задумано. Для этого необходимо выполнить (при этом, реальных изменений никаких не будет, так как запуск будет выполнен в отладочном режиме):

После того, как по диагностическим сообщениям стало ясно, что все в порядке, необходимо непосредственно запустить ротацию:

В дальнейшем ротация будет выполняться автоматически с заданным в конфигурационном файле интервалом.

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

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

Exploring the Logrotate Configuration

Logrotate’s configuration information can generally be found in two places on Ubuntu:

  • : this file contains some default settings and sets up rotation for a few logs that are not owned by any system packages. It also uses an statement to pull in configuration from any file in the directory.
  • : this is where any packages you install that need help with log rotation will place their Logrotate configuration. On a standard install you should already have files here for basic system tools like , , and so on.

By default, will configure weekly log rotations (), with log files owned by the root user and the syslog group (), with four log files being kept (), and new empty log files being created after the current one is rotated ().

Let’s take a look at a package’s Logrotate configuration file in . the file for the package utility:

This file contains configuration blocks for two different log files in the directory: and . They both have the same options. Any options not set in these configuration blocks will inherit the default values or those set in . The options set for the logs are:

  • : keep twelve old log files.
  • : rotate once a month.
  • : compress the rotated files. this uses by default and results in files ending in . The compression command can be changed using the option.
  • : don’t write an error message if the log file is missing.
  • : don’t rotate the log file if it is empty.

There are many more configuration options available. You can read about all of them by typing on the command line to bring up Logrotate’s manual page.

Next, we’ll set up a configuration file to handle logs for a fictional service.

Параметры запуска

Параметр Описание
-d debug — отладочный режим.
В режиме отладки не будут производиться изменения в log-файле и файле состояния
-f
—force
Принудительно произвести ротацию, даже если в данный момент она не требуется
-m <команда>
—mail <команда>
Указать команду для отправки почты.
Команда должна принимать два аргумента: тема сообщения и адрес получателя.
Текст письма передается стандартным вводом (stdin).
По умолчанию /usr/bin/mail -s
-s <файл>
—state <файл>
Указать куда записать файл состояния.
Что — то типа лога, показывает последнюю дату когда производилась ротация
(если создания архива не требуется правилами, то дата все ровно обновляется)
По умолчанию /var/lib/logrotate/status
Добавить комментарий

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

Adblock
detector