Ротация логов с помощью logrotate в Debian / Ubuntu

Добавить в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru memori.ru moemesto.ru


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

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

Установка Logrotate

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

$ sudo aptitude install logrotate

Краткое описание файла настроек Logrotate

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

$ more /etc/logrotate.d/apache2
/var/log/apache2/*.log {
        weekly              # ротация раз в неделю
        missingok           # отсутствие файла не является ошибкой
        rotate 52           # сохраняется последние 52 ротированных файла
        compress            # сжимать ротируемый файл
        delaycompress       # сжимать предыдущий файл при следующей ротации 
                            # (т.е. файл *.log.1 будет не сжат, а *.log.2 и далее сжатыми)
        notifempty          # не обрабатывать пустые файлы
        create 640 root adm # сразу после ротации создать пустой файл с заданными правами и пользователем
        sharedscripts       # крипты prerotate/postrotate будут выполнены только один раз
                            # не зависимо от количества журналов, подходящих под заданный шаблон
        postrotate          # скрипт будет выполнен сразу после ротации
                if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
                        /etc/init.d/apache2 reload > /dev/null
                fi
        endscript
}

При этом, первая строка /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/debianworld.ru/logs/ располагаются лог-файлы таких веб серверов, как nginx и apache. Работают они в связке: nginx - фронтенд, apache2-бэкенд.

$ more /etc/logrotate.d/debianworld.ru
# Ротация логов nginx (front-end)
# Отдает статику, все остальное - проксирует на apache.
# Лог ведется более интенсивно. 
/home/dw/debianworld.ru/logs/nginx_*.log {
    daily                   # ежедневная ротация
    missingok               # отсутствие файла не является ошибкой
    rotate 45               # хранится история за 45 дней
    compress                # ротируемые файлы сжимаются
    delaycompress           # ротируемый файл не сжимается, остальные - сжимаются
    notifempty              # не обрабатывать пустые файлы
    create 640 dw www-data  # права, пользователь нового файла
    sharedscripts           # prerotate/postrotate выполняются только 1 раз
    prerotate               # Cбор статистики посещений для AWstats
            /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=debianworld.ru -databasebreak=day
    endscript               
    postrotate              # Перезапуск nginx
            [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

# Ротация логов apache2 (back-end)
# Лог ведется менее интенсивно.
/home/dw/debianworld.ru/logs/apache*.log {
    weekly                   # еженедельная ротация
    missingok                # отсутствие файла не является ошибкой
    rotate 4                 # хранится история за 4 недели
    compress                 # ротируемые файлы сжимаются
    nodelaycompress          # ротируемый файл так же сжимается
    notifempty               # не обрабатывать пустые файлы
    create 640 dw www-data   # права, пользователь нового файла
    sharedscripts            # postrotate выполняется только 1 раз
    postrotate               # Перезапуск apache2
            if [ -f /var/run/apache.pid ]; then
                /etc/init.d/apache2 restart > /dev/null
            fi
    endscript
}

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

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

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

$ sudo logrotate -d /etc/logrotate.d/debianworld.ru

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

$ sudo logrotate -v -f /etc/logrotate.d/debianworld.ru

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

Вопросы по теме ...

Есть еще вопрос?