Как управлять файлами журналов с помощью Logrotate в Ubuntu 16.04
Введение
Logrotate — это системная утилита, которая управляет автоматическим чередованием и сжатием файлов журналов. Если бы файлы журналов не ротировались, не сжимались и не удалялись периодически, они могли бы в конечном итоге занять все доступное дисковое пространство в системе.
Logrotate установлен по умолчанию в Ubuntu 16.04 и настроен для обработки потребностей в ротации журналов всех установленных пакетов, включая rsyslog
, обработчик системного журнала по умолчанию.
В этой статье мы рассмотрим конфигурацию Logrotate по умолчанию, а затем настроим ротацию журналов для вымышленного пользовательского приложения.
Предпосылки
В этом руководстве предполагается, что у вас есть сервер Ubuntu 16.04 с пользователем без полномочий root с поддержкой sudo, как описано в разделе Начальная настройка сервера с Ubuntu 16.04.
Logrotate доступен и во многих других дистрибутивах Linux, но конфигурация по умолчанию может сильно отличаться. Другие разделы этого руководства будут применяться до тех пор, пока ваша версия Logrotate аналогична версии Ubuntu 16.04. Выполните шаг 1, чтобы определить версию Logrotate.
Войдите на свой сервер как пользователь с поддержкой sudo, чтобы начать.
Подтверждение вашей версии Logrotate
Если вы используете сервер, отличный от Ubuntu, сначала убедитесь, что Logrotate установлен, запросив информацию о его версии:
- logrotate --version
Outputlogrotate 3.8.7
Если Logrotate не установлен, вы получите сообщение об ошибке. Пожалуйста, установите программное обеспечение, используя менеджер пакетов вашего дистрибутива Linux.
Если Logrotate установлен, но номер версии значительно отличается, у вас могут возникнуть проблемы с некоторыми настройками, описанными в этом руководстве. Обратитесь к документации по вашей конкретной версии Logrotate, прочитав ее man
страницу:
- man logrotate
Далее мы рассмотрим структуру конфигурации Logrotate по умолчанию в Ubuntu.
Изучение конфигурации Logrotate
Информацию о конфигурации Logrotate обычно можно найти в двух местах в Ubuntu:
/etc/logrotate.conf
: этот файл содержит некоторые настройки по умолчанию и устанавливает ротацию для нескольких журналов, которые не принадлежат никаким системным пакетам. Он также использует операторinclude
для извлечения конфигурации из любого файла в каталоге/etc/logrotate.d
./etc/logrotate.d/
: здесь все устанавливаемые вами пакеты, которым нужна помощь с ротацией журналов, будут размещать свою конфигурацию Logrotate. При стандартной установке у вас уже должны быть файлы для основных системных инструментов, таких какapt
,dpkg
,rsyslog
и т. д.
По умолчанию logrotate.conf
настраивает еженедельную ротацию журналов (еженедельно
), при этом файлы журналов принадлежат пользователю root и группе системных журналов (su root syslog
), с сохранением четырех файлов журнала (rotate 4
) и созданием новых пустых файлов журнала после ротации текущего файла (create
).
Давайте посмотрим на файл конфигурации Logrotate пакета в /etc/logrotate.d
. cat
файл для утилиты пакета apt
:
- cat /etc/logrotate.d/apt
Output/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
установлены следующие параметры:
повернуть на 12
: сохранить двенадцать старых файлов журнала.ежемесячно
: чередование раз в месяц.сжать
: сжать повернутые файлы. это используетgzip
по умолчанию и приводит к файлам, оканчивающимся на.gz
. Команду сжатия можно изменить с помощью параметраcompresscmd
.missingok
: не выводить сообщение об ошибке, если файл журнала отсутствует.notifempty
: не менять файл журнала, если он пуст.
Доступно еще много вариантов конфигурации. Вы можете прочитать обо всех них, набрав man logrotate
в командной строке, чтобы открыть справочную страницу Logrotate.
Далее мы настроим файл конфигурации для обработки журналов вымышленной службы.
Настройка примера конфигурации
Для управления файлами журнала для приложений за пределами предварительно упакованных и предварительно настроенных системных служб у нас есть два варианта:
- Создайте новый файл конфигурации Logrotate и поместите его в
/etc/logrotate.d/
. Это будет выполняться ежедневно от имени пользователя root вместе со всеми другими стандартными заданиями Logrotate. - Создайте новый файл конфигурации и запустите его за пределами настройки Logrotate по умолчанию в Ubuntu. Это действительно необходимо, только если вам нужно запускать Logrotate от имени пользователя без полномочий root или если вы хотите менять журналы чаще, чем ежедневно (конфигурация
ежечасно
в/etc/logrotate.d). /
будет неэффективным, потому что системная установка Logrotate запускается только один раз в день).
Давайте рассмотрим эти два варианта с некоторыми примерами настроек.
Добавление конфигурации в /etc/logrotate.d/
Мы хотим настроить ротацию журналов для вымышленного веб-сервера, который помещает access.log
и error.log
в /var/log/example-app/
. Он работает как пользователь и группа www-data
.
Чтобы добавить некоторую конфигурацию в /etc/logrotate.d/
, сначала откройте там новый файл:
- sudo nano /etc/logrotate.d/example-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
}
Вот некоторые из новых директив конфигурации в этом файле:
создать 0640 www-data www-data
: создает новый пустой файл журнала после ротации с указанными разрешениями (0640
), владельцем (www -data
) и группу (такжеwww-data
).sharedscripts
: этот флаг означает, что любые скрипты, добавленные в конфигурацию, запускаются только один раз за прогон, а не для каждого ротируемого файла. Поскольку эта конфигурация соответствует двум файлам журнала в каталогеexample-app
, сценарий, указанный вpostrotate
, будет запускаться дважды без этой опции.postrotate
toendscript
: этот блок содержит скрипт, запускаемый после ротации файла журнала. В этом случае мы перезагружаем наше примерное приложение. Иногда это необходимо, чтобы ваше приложение переключилось на только что созданный файл журнала. Обратите внимание, чтоpostrotate
запускается перед сжатием журналов. Сжатие может занять много времени, и ваше программное обеспечение должно немедленно переключиться на новый файл журнала. Для задач, которые необходимо запустить после сжатия журналов, используйте блокlastaction
.
После настройки конфигурации в соответствии с вашими потребностями и сохранения ее в /etc/logrotate.d
вы можете протестировать ее, выполнив пробный запуск:
- sudo logrotate /etc/logrotate.conf --debug
Это вызывает logrotate
, указывает на стандартный файл конфигурации и включает режим отладки.
Будет распечатана информация о том, какие файлы журналов обрабатывает Logrotate и что он с ними сделал. Если все выглядит хорошо, все готово. Стандартное задание Logrotate будет запускаться один раз в день и включать вашу новую конфигурацию.
Далее мы попробуем установку, которая вообще не использует конфигурацию Ubuntu по умолчанию.
Создание независимой конфигурации Logrotate
В этом примере у нас есть приложение, работающее от нашего пользователя sammy, генерирующее журналы, которые хранятся в /home/sammy/logs/
. Мы хотим, чтобы эти журналы менялись ежечасно, поэтому нам нужно настроить это вне структуры /etc/logrotate.d
, предоставляемой Ubuntu.
Сначала мы создадим файл конфигурации в нашем домашнем каталоге. Откройте его в текстовом редакторе:
- nano /home/sammy/logrotate.conf
Затем вставьте следующую конфигурацию:
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
Сохраните и закройте файл. Мы видели все эти параметры на предыдущих шагах, но давайте подытожим: эта конфигурация будет менять файлы ежечасно, сжимая и сохраняя двадцать четыре старых журнала и создавая новый файл журнала для замены ротированного.
Вам нужно будет настроить конфигурацию в соответствии с вашим приложением, но это хорошее начало.
Чтобы проверить, что это работает, давайте создадим файл журнала:
- cd ~
- mkdir logs
- touch logs/access.log
Теперь, когда у нас есть пустой файл журнала в нужном месте, давайте запустим команду logrotate
.
Поскольку журналы принадлежат Сэмми, нам не нужно использовать sudo
. Однако нам нужно указать файл state. Этот файл записывает, что logrotate
видел и делал в прошлый раз, чтобы знать, что делать при следующем запуске. Это делается для нас при использовании установки Ubuntu Logrotate (ее можно найти в /var/lib/logrotate/status
), но сейчас нам нужно сделать это вручную.
В этом примере Logrotate поместит файл состояния прямо в наш домашний каталог. Я могу пойти куда угодно, что доступно и удобно:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Outputreading config file /home/sammy/logrotate.conf
Handling 1 logs
rotating pattern: /home/sammy/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/sammy/logs/access.log
log does not need rotating
--verbose
распечатает подробную информацию о том, что делает Logrotate. В данном случае похоже, что он ничего не вращал. Это первый раз, когда Logrotate видит этот файл журнала, поэтому, насколько ему известно, этому файлу ноль часов, и его не следует ротировать.
Если мы посмотрим на файл состояния, то увидим, что Logrotate записал некоторую информацию о запуске:
- cat /home/sammy/logrotate-state
Outputlogrotate state -- version 2
"/home/sammy/logs/access.log" 2017-11-7-19:0:0
Logrotate отметил журналы, которые он видел, и когда он в последний раз рассматривал их для ротации. Если мы запустим эту же команду через час, журнал будет свернут, как и ожидалось.
Если вы хотите заставить Logrotate ротировать файл журнала, когда в противном случае это было бы невозможно, используйте флаг --force
:
- logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force
Это полезно при тестировании postrotate
и других скриптов.
Наконец, нам нужно настроить задание cron для запуска Logrotate каждый час. Откройте crontab вашего пользователя:
- crontab -e
Это откроет текстовый файл. В файле уже могут быть некоторые комментарии, поясняющие ожидаемый базовый синтаксис. Переместите курсор вниз на новую пустую строку в конце файла и добавьте следующее:
crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
Эта задача будет выполняться на 14-й минуте каждого часа каждый день. Он запускает в основном ту же команду logrotate
, которую мы запускали ранее, хотя мы расширили logrotate
до полного пути /usr/sbin/logrotate
, просто чтобы быть безопасный. Хорошей практикой является максимально подробное описание заданий cron.
Сохраните файл и выйдите. Это установит crontab, и наша задача будет выполняться по указанному расписанию.
Если мы вернемся к нашему каталогу журналов примерно через час, мы должны найти повернутый и сжатый файл журнала access.log.1.gz
(или .2.gz
, если вы запустили Logrotate с флагом --force
).
Заключение
В этом руководстве мы проверили нашу версию Logrotate, изучили конфигурацию Ubuntu Logrotate по умолчанию и настроили два разных типа пользовательских конфигураций. Чтобы узнать больше о командной строке и параметрах конфигурации, доступных для Logrotate, вы можете прочитать его справочную страницу, запустив man logrotate
в своем терминале.