Запуск любой программы или процесса в среде Linux сопровождается созданием журнала для фиксации всех связанных с их работой изменений. Логами называют вносимые в эти журналы записи. Эта информация затем используется сервером для организации своей работы и служит отправной точкой для поиска возникающих в системе сбоев. Однако, со временем журналы логов разрастаются и, поэтому, возникает необходимость в их обслуживании. LogRotate входит в состав базового программного обеспечения (ПО) Linux-систем и предназначена для выполнения указанных функций. Рассмотрим её работу более детально.
Механизм управления логами в Linux-подобных системах
Программа LogRotate работает в автоматическом режиме и принципиально не нуждается в настройке. Однако, в целях обеспечения большей гибкости по управлению логами и удобства для Администратора системы её всё-таки приходится конфигурировать под свои нужды. Для этого разработчиками предусмотрено наличие нескольких уровней управления, которые будут рассмотрены нами ниже. Но, вначале укажем сам алгоритм выполняемых ею операций, которые и обеспечивают поддержку системы фиксации изменений и её обслуживание.
Обслуживание системы логов сводится к добавлению в журналы новых записей, а также обеспечению их автоматической ротации. Последовательность действий при этом будет примерно следующей:
- Создание пустого журнала сразу после инициализации нового процесса;
- Внесение в журнал записей при возникновении любого события, связанного с запущенным процессом;
- Архивирование файла журнала в случае его заполнения;
- Помещение созданного архива в заранее определённое место.
Как уже говорилось выше, управлять настройками программы можно на нескольких уровнях. Их приоритетность соответствует обратному порядку в списке. Перечислим их:
- Системный уровень;
- Уровень отдельного процесса;
- Уровень пользователя системы.
Системный уровень. Базовый уровень, на котором определяются типы основных операций, выполняемых программой для любого процесса – создание журналов, их архивирование, перемещение и т. д. Настройки выставляются в файле конфигурации программы logrotate.conf.
Уровень отдельного процесса. Даёт возможность управлять поведением программы по отношению к любому запущенному процессу, как системному, так и пользовательскому. Это обеспечивается внесением изменений в конфигурационные файлы, хранимые для каждого запущенного в системе процесса, список которых можно найти в системном каталоге logrotate.d.
Уровень пользователя системы. Позволяет выполнить настройки для каждого пользователя системы. В этом случае файл конфигурации программы LogRotate и журналы с логами находятся в домашнем каталоге пользователя. Такие настройки параметров будут иметь наивысший приоритет, что позволяет перекрывать любые их значения, установленные по умолчанию в системном файле конфигурации.
Ниже будут приведены примеры внесения изменений на каждом из указанных уровней.
Системный уровень конфигурирования LogRotate
Будем для работы использовать сервер под управлением Ubuntu 22.04. Для начала, узнаем, какая версия программы установлена в системе. Для этого наберём в терминале:
$ logrotate --version
Как видим, установлена версия 3.19.0.
Просмотрим содержимое главного файла конфигурации с помощью следующей команды:
$ nano /etc/logrotate.conf
Таким образом, общие операции и настройки для управления логами для всех запущенных в системе процессов будут следующими:
weekly
su root adm
rotate 4
create
include /etc/logrotate.d
Здесь weekly – указание на еженедельный запуск приложения; su root adm – установка администраторской группы по умолчанию; rotate – параметр, указывающий на максимальное количество хранимых в системном каталоге старых журналов; create – команда создания новых файлов-журналов; include /etc/logrotate.d – указание на путь к системному каталогу, в котором хранятся файлы конфигурации запущенных процессов.
При необходимости мы могли бы тут же внести нужные изменения в указанный файл и таким образом сконфигурировать LogRotate под свои нужды. Однако, это была бы очень грубая настройка, поскольку, любое внесённое изменение коснулось бы абсолютно всех процессов. Поэтому для этих целей целесообразно использовать другие уровни конфигурирования приложения.
Управление логами на уровне процессов
Этот уровень позволяет осуществлять гибкие настройки программы по отношению к любому из запущенных в системе процессов.
Просмотрим содержимое системного каталога logrotate.d, в котором хранятся файлы конфигурации, названия которых соответствуют названиям соответствующих процессов. Это можно сделать с помощью следующей команды:
$ ls -l /etc/logrotate.d
Например, для службы отчетов об ошибках с именем apport, как видим, файл конфигурации имеет одноимённое название.
Просмотрим имеющиеся настройки системы обработки логов для этой службы. Для этого введём в терминале:
$ cat /etc/logrotate.d/apport
Вот эти параметры:
daily
rotate 7
delaycompress
compress
notifempty
missingok
Поясним значения некоторых параметров. Здесь daily – указание на ежедневный запуск; compress – указание на необходимость архивирования журнала; delaycompress – указание на отложенную архивацию журнала; notifempty – запрет на ротацию журнала в случае, если он пуст; missingok – запрет на вывод ошибки в случае отсутствия файла с логами.
Как видим, некоторые из параметров отличаются от установленных по умолчанию на системном уровне. Также появились новые, например, такие, как delaycompress, который используется в случае, если невозможно выполнять архивацию журналов при работающем приложении.
Место хранения журналов для приложения apport: /var/log/apport.log.
Настроим параметры программы для обслуживания пользовательского процесса с именем user-proc. Для этого подготовим в системном каталоге файл конфигурации с определением нужных нам параметров. Создадим его с помощью редактора nano:
$ nano /etc/logrotate.d/user-proc
В открывшемся окне редактора введём следующий код:
/var/log/user-proc/*.log {
weekly
rotate 5
compress
create
missingok
notifempty
sharedscripts
postrotate
systemctl reload user-proc
endscript
}
Поясним значения ещё не рассмотренных ранее параметров. Здесь sharedscripts – разрешает единоразовое выполнение для скриптов, описанных в конфигурации; postrotate – определяет скрипт, который закрывается тегом endscript, в данном случае, скрипт гарантирует перезагрузку процесса user-proc при каждом обновлении системы.
После внесения изменений, сохраним их и выйдем из редактора.
Следующим шагом для настройки системы обработки логов для нашего процесса будет создание каталога для хранения файлов журналов. Создадим его:
$ mkdir /var/log/user-proc
В завершение, нам осталось протестировать созданную конфигурацию, чтобы убедиться, что всё работает. Для этого запустим программу в режиме отладки:
$ sudo logrotate /etc/logrotate.conf --debug
Мы видим, что файл с именем user-proc появился в списке системного каталога logrotate.d. Кроме того, можно убедиться, что установленные нами параметры были зафиксированы и применены к указанному процессу. Об этом говорят следующие записи:
rotating pattern: /var/log/user-proc/*.log weekly (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/user-proc/*.log
log /var/log/user-proc/*.log does not exist -- skipping
Это означает, что настройка для user-proc прошла успешно.
Управление логами на уровне пользователя системы
Для начала, создадим пользователя, для которого мы будем настраивать конфигурацию системы обработки логов. Набираем в терминале:
$ sudo useradd -m -s /bin/bash -c "Admin User Ubuntu" userubuntu
Здесь userubuntu – новый пользователь системы, входящий в администраторскую группу; параметр m указывает на необходимость создания домашнего каталога для него; s – определяет оболочку для входа; -c – определяет комментарий.
Создадим файл конфигурации для userubuntu:
$ nano /home/userubuntu/logrotate.conf
Введём в него следующий код:
/home/userubuntu/logs/*.log {
daily
rotate 12
missingok
create
compress
}
Как видим, мы указали уже известные нам параметры. Сохраним файл и вернёмся в командную строку.
Мы уже знаем, что теперь нам осталось определить место для хранения файлов журналов. Введём в терминале:
$ mkdir /home/userubuntu/logs
$ echo > /home/userubuntu/logs/access.log
С помощью указанных команд мы создали каталог для хранения журнала и сам файл журнала с именем access.log.
Теперь остаётся протестировать работоспособность созданной конфигурации. Для этого запустим LogRotate:
$ logrotate /home/userubuntu/logrotate.conf --state /home/userubuntu/logrotate-state --verbose
Выведенная информация говорит о том, что конфигурация является рабочей:
rotating pattern: /home/userubuntu/logs/*.log after 1 days (12 rotations)
empty log files are rotated, old logs are removed
considering log /home/userubuntu/logs/access.log
Now: 2023-09-21 09:59
Last rotated at 2023-09-21 09:00
log does not need rotating (log has already been rotated)
Теперь просмотрим содержимое файла состояний:
$ nano /home/userubuntu/logrotate-state
Как видим, здесь зафиксировались дата и время запуска процесса – 2023-9-21-9:0:0.
Теперь с помощью планировщика задач настроим автоматический запуск программы через каждый час для пользователя userubuntu:
$ crontab -e
После запуска планировщика появится список для выбора редактора. После подтверждения выбора редактора, установленного по умолчанию (nano), откроется окно для настройки заданий. Добавим в конец файла следующую строку кода:
30 * * * * /usr/sbin/logrotate /home/userubuntu/logrotate.conf --state /home/userubuntu/logrotate-state
Сохраним внесённые изменения и закроем файл.
Таким образом, согласно сделанным установкам, LogRotate будет запускаться на тридцатой минуте каждого часа. И так круглые сутки.