Введение
Logrotate – это системная утилита, которая управляет автоматическим вращением и сжатием файлов журналов. Если файлы журналов не поворачиваются, сжимаются и периодически обрезаются, они могут в конечном итоге занять всё доступное место на диске в системе.
Logrotate устанавливается по умолчанию в Ubuntu 22.04 и настроен для обработки потребностей в вращении журналов всех установленных пакетов, включая rsyslog
, процессор системного журнала по умолчанию.
В этой статье мы рассмотрим конфигурацию Logrotate по умолчанию, а затем настроим вращение журналов для вымышленного пользовательского приложения.
Предварительные требования
В этом руководстве предполагается, что у вас есть сервер Ubuntu 22.04 с непривилегированным пользователем с возможностью sudo, как описано в Начальная настройка сервера с Ubuntu 22.04.
Logrotate также доступен во многих других дистрибутивах Linux, однако конфигурация по умолчанию может быть довольно отличной. Другие разделы этого руководства всё равно будут применимы, пока ваша версия Logrotate подобна версии Ubuntu 22.04. Следуйте Шагу 1, чтобы определить версию Logrotate.
Войдите на сервер под вашим пользователем с sudo, чтобы начать.
Шаг 1 — Подтверждение версии Logrotate
Logrotate установлен по умолчанию в Ubuntu. Однако, если вам нужно установить его, выполните следующие команды, чтобы обновить список пакетов и получить пакет:
Если вы используете сервер не на Ubuntu, сначала убедитесь, что Logrotate установлен, запросив информацию о его версии:
Outputlogrotate 3.19.0
Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes
Если Logrotate установлен, но номер версии существенно отличается, у вас могут возникнуть проблемы с некоторыми из настроек, рассмотренных в этом руководстве. Обратитесь к документации для вашей конкретной версии Logrotate, прочитав ее руководство (man
):
Вы также можете обратиться к онлайн-версии документации по Logrotate. Далее мы рассмотрим структуру конфигурации Logrotate по умолчанию в Ubuntu.
Шаг 2 — Изучение конфигурации Logrotate
Информация о конфигурации Logrotate обычно находится в двух местах в Ubuntu:
/etc/logrotate.conf
: в этом файле содержатся некоторые параметры по умолчанию и настраивается поворот нескольких журналов, не принадлежащих ни одному из пакетов системы. Он также использует операторinclude
для включения конфигурации из любого файла в каталоге/etc/logrotate.d
./etc/logrotate.d/
: здесь располагается конфигурация Logrotate для любых установленных вами пакетов, которым требуется помощь с поворотом журналов. По умолчанию здесь уже должны быть файлы для основных системных утилит, таких какapt
,dpkg
,rsyslog
и т. д.
По умолчанию в logrotate.conf
настраивается еженедельный поворот журналов, с журналами, принадлежащими пользователю root и группе syslog, при этом остаются четыре журнала (rotate 4
), и после поворота текущего журнала создаются новые пустые журналы (create
).
Давайте посмотрим на файл конфигурации Logrotate для пакета в каталоге /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
. Любая установка в файле конфигурации Logrotate переопределит значения по умолчанию Logrotate, которые настроены в файле /etc/logrotate.conf
. Установленные параметры для журналов apt
следующие:
rotate 12
: сохранять двенадцать старых файлов журналов. Это переопределяет стандартное значениеrotate 4
.monthly
: вращать раз в месяц. Это переопределяет стандартное значениеweekly
.compress
: сжимать повернутые файлы. По умолчанию используетсяgzip
, что приводит к появлению файлов с расширением.gz
. Команду сжатия можно изменить, используя опциюcompresscmd
.missingok
: не выводить сообщение об ошибке, если файл журнала отсутствует.notifempty
: не вращать файл журнала, если он пуст.
Эти файлы конфигурации также наследуют стандартное поведение create
, которое указывает Logrotate создавать новые журналы после вращения. Это можно переопределить с помощью nocreate
, хотя это фактически отключит большую часть другой функциональности.
Доступно еще много других параметров конфигурации. Вы можете узнать о них, набрав man logrotate
в командной строке, чтобы открыть страницу руководства по Logrotate.
Затем мы настроим файл конфигурации для обработки журналов для вымышленного сервиса с названием your-app
.
Шаг 3 — Настройка примера конфигурации
Чтобы управлять файлами журналов с помощью logrotate для приложений вне предварительно упакованных и предварительно сконфигурированных системных служб, у нас есть два варианта:
- Создайте новый файл конфигурации Logrotate и поместите его в
/etc/logrotate.d/
. Он будет запускаться ежедневно от имени пользователя root вместе со всеми остальными стандартными заданиями Logrotate. - Создайте новый файл конфигурации и запустите его вне стандартной настройки Logrotate в Ubuntu. Это действительно необходимо только в случае, если вам нужно запустить Logrotate от имени не-root пользователя или если вы хотите выполнять вращение журналов чаще, чем ежедневно (конфигурация
hourly
в/etc/logrotate.d/
будет неэффективной, потому что стандартная настройка Logrotate системы запускается только один раз в день).
Давайте рассмотрим эти два варианта с некоторыми примерами настроек.
Добавление конфигурации в /etc/logrotate.d/
Мы хотим настроить вращение журналов для вымышленного веб-сервера, который помещает access.log
и error.log
в /var/log/your-app/
. Он запускается от имени пользователя и группы www-data
.
Чтобы добавить конфигурацию для журналов your-app
в /etc/logrotate.d/
, сначала откройте новый файл в каталоге /etc/logrotate.d
с помощью nano
или вашего предпочтительного редактора:
Добавьте следующие строки в ваш новый файл конфигурации:
/var/log/your-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload your-app
endscript
}
Некоторые из новых директив конфигурации в этом файле:
create 0640 www-data www-data
: это создает новый пустой файл журнала после его вращения с указанными разрешениями (0640
), владельцем (www-data
) и группой (такжеwww-data
).sharedscripts
: этот флаг означает, что любые скрипты, добавленные в конфигурацию, выполняются только один раз за запуск, а не для каждого вращаемого файла. Поскольку путь/var/log/your-app/*.log
содержит шаблон*
, эта конфигурация будет соответствовать любому количеству файлов журналов в каталогеyour-app
. Без опцииsharedscripts
скрипт, указанный вpostrotate
, будет выполняться каждый раз, когда logrotate обрабатывает файл журнала без этой опции.postrotate
доendscript
: этот блок содержит скрипт, который запускается после вращения файла журнала. В этом случае мы перезагружаем наш пример приложения. Иногда это необходимо, чтобы ваше приложение переключилось на вновь созданный файл журнала.
Обратите внимание, чтоpostrotate
запускается до сжатия журналов. Сжатие может занять много времени, и ваше программное обеспечение должно немедленно переключиться на новый файл журнала. Для задач, которые нужно выполнить после сжатия журналов, используйте вместо этого блокаlastaction
.
Чтобы сохранить и выйти из nano
, нажмите Ctrl+X
, и когда будет запрос, введите Y
, а затем Enter
. Вы можете протестировать конфигурационный файл, выполнив пробный запуск:
Эта команда вызывает logrotate
, указывает ему стандартный файл конфигурации и включает режим отладки.
Информация будет выведена о том, какие файлы журналов обрабатывает Logrotate и что он сделал бы с ними. Если все выглядит хорошо, вы завершили. Стандартная задача Logrotate будет запускаться ежедневно и включать вашу новую конфигурацию.
Далее мы попробуем настроить систему, которая вообще не использует стандартную конфигурацию Ubuntu.
Шаг 4 — Создание независимой конфигурации Logrotate
В этом примере у нас есть приложение, работающее от имени пользователя sammy
, генерирующее журналы, которые хранятся в /home/sammy/logs/
. Мы хотим вращать эти журналы каждый час, поэтому нам нужно настроить это вне структуры /etc/logrotate.d
, предоставленной Ubuntu.
Сначала мы создадим файл конфигурации в нашей домашней директории. Откройте его в текстовом редакторе:
Затем вставьте следующую конфигурацию:
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
Сохраните и закройте файл. Мы сталкивались со всеми этими параметрами на предыдущих этапах, но давайте суммируем: эта конфигурация будет вращать файлы каждый час, сжимая и сохраняя двадцать четыре старых журнала и создавая новый журнальный файл для замены вращаемого.
Вам нужно настроить конфигурацию под свое приложение, но это хороший старт.
Чтобы проверить, что конфигурация работает, давайте создадим файл журнала. Сначала выполните команду cd ~
для перехода в домашний каталог вашего пользователя. Затем создайте каталог для журналов, используя команду mkdir
. Наконец, создайте пустой файл в каталоге logs
, используя команду touch
. Выполните следующие команды в указанном порядке:
Теперь, когда у нас есть пустой файл журнала в нужном месте, давайте запустим команду logrotate
.
Поскольку журналы принадлежат пользователю sammy
, нам не нужно использовать sudo
. Однако мы должны указать файл состояния. Этот файл записывает информацию о том, что обнаружил и какие действия выполнил logrotate
в последний раз, чтобы он знал, что делать в следующий раз. Этот механизм отслеживания состояния автоматически настраивается для нас при использовании стандартной конфигурации /etc/logrotate.conf
. Файл состояния хранится в /var/lib/logrotate/status
. Поскольку мы не используем стандартную конфигурацию, нам нужно будет настроить расположение файла состояния вручную.
Мы укажем Logrotate поместить файл состояния прямо в наш домашний каталог для этого примера. Он может находиться в любом доступном и удобном месте. Выполните следующую команду для использования /home/sammy/logrotate.conf
, который вы создали, и записи состояния, с которым столкнулся 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 встречает этот файл журнала, и он нулевого возраста, поэтому его не нужно поворачивать.
Если мы рассмотрим состояние файла с помощью утилиты cat
, мы заметим, что Logrotate записал некоторую информацию о запуске:
Outputlogrotate state -- version 2
"/home/sammy/logs/access.log" 2022-07-2-19:0:0
Logrotate отметил журналы, которые он видел, и когда последний раз рассматривал их для вращения. Если мы запустим эту же команду через час, журнал будет вращен, как ожидалось.
Если вы хотите заставить Logrotate вращать файл журнала, когда он не делал бы этого, используйте флаг --force
:
Это полезно при тестировании postrotate
и других скриптов.
Наконец, нам нужно настроить cron-задание для запуска Logrotate каждый час. Откройте crontab вашего пользователя:
Это откроет текстовый файл. Если вы впервые используете cron, вам может быть предложено выбрать текстовый редактор по умолчанию. Если у вас нет предпочтений, мы рекомендуем nano
для новых пользователей. В файле может уже быть несколько комментариев, объясняющих синтаксис cron. Переместите курсор вниз к новой пустой строке в конце файла и добавьте следующее:
crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
Это задание будет запускаться в 14-ю минуту каждого часа, каждый день. Оно запускает практически ту же команду logrotate
, которую мы запускали ранее, хотя мы расширили logrotate
до полного пути /usr/sbin/logrotate
, чтобы быть уверенными. Хорошей практикой является использование полных путей при написании cron-задач. Чтобы узнать больше о cron, вы можете ознакомиться с нашими другими руководствами.
Сохраните файл и выйдите. Это установит crontab, и наше задание будет запускаться в указанное время.
Если мы вернемся к нашему каталогу журналов примерно через час, мы должны обнаружить повернутый и сжатый файл журнала access.log.1.gz
(или .2.gz
, если вы запустили Logrotate с флагом --force
).
Вывод
В этом руководстве мы проверили версию Logrotate, исследовали конфигурацию по умолчанию для Ubuntu Logrotate и настроили два различных типа пользовательских конфигураций. Чтобы узнать больше о доступных параметрах командной строки и конфигурации для Logrotate, вы можете прочитать его руководство, запустив man logrotate
в вашем терминале или посетив онлайн-документацию.