Запуск будь-якої програми або процесу в середовищі 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 запускатиметься на тридцятій хвилині кожної години. І так цілодобово.