Системное логирование с использованием systemd
Системный менеджер systemd представлен в большинстве современных Linux-дистрибутивах, включая Ubuntu, Debian и CentOS. Он выполняет функции управления сервером и службами, такие как запуск и остановка, а также отвечает за логирование. Журнал systemd, известный как journal, собирает системные сообщения от ядра, служб и приложений. Логирование с использованием systemd может работать параллельно с syslog или заменить его полностью.
Для работы с журналом используется утилита journalctl.
Просмотр и фильтрация логов
Отображение времени в логах
Записи журнала могут быть просмотрены с учетом местного времени или времени UTC, используя опцию --utc в команде.
По умолчанию, логи выводятся с учетом местного времени. Вы можете убедиться в правильности настройки часового пояса, выполнив следующую команду:
timedatectl status
Корректный часовой пояс будет отображен в строке Local time.
Если необходимо внести изменения, вы можете просмотреть список доступных часовых поясов:
timedatectl list-timezones
Затем установите желаемый часовой пояс:
timedatectl set-timezone часовой_пояс
После этого повторно проверьте настройки с помощью команды timedatectl status.
Фильтр по определенной загрузке
Для вывода событий из последней (текущей) загрузки используйте опцию -b:
journalctl -b
Если вам нужно отобразить записи с указанием времени в формате UTC:
journalctl -b --utc
Чтобы вывести список доступных загрузок:
journalctl --list-boots
Пример вывода:
-2 b94zf405f9424a1d39b667ce0bdbcff7 Wed 2020-07-08 08:34:12 MSK—Wed 2020-07-08 08:41:22 MSK
-1 t80dc883d180dc04z5db0abcb0dc5fa2 Wed 2020-07-08 09:01:46 MSK—Wed 2020-07-08 09:28:08 MSK
0 8cabc9420ea34a8d868e3014895269d8 Wed 2020-07-08 11:56:57 MSK—Wed 2020-07-08 13:51:27 MSK
Чтобы просмотреть данные конкретной загрузки из списка, укажите ее порядковый номер (первая колонка в выводе) или ID (вторая колонка):
journalctl -b -1
# Или:
journalctl -b t80dc883d180dc04z5db0abcb0dc5fa2
Если по умолчанию предыдущие загрузки не сохраняются, вам следует внести изменения в файл конфигурации:
sudo nano /etc/systemd/journald.conf
Затем замените значение для параметра Storage на persistent:
[Journal]
Storage=persistent
Фильтр по временному промежутку
Если вас интересует период, который не совпадает с предыдущими загрузками, вы можете указать конкретное временное окно. Для этого используются следующие опции:
- --since (начиная с)
- --until (до)
- Время указывается в формате: "ГГГГ-ММ-ДД ЧЧ:ММ:СС"
- Также можно использовать ключевые слова yesterday (вчера), today (сегодня), now (сейчас)
Например, чтобы просмотреть события с указанного времени до текущего момента:
journalctl --since "2020-07-06 07:00:00"
Для вывода событий за определенный период времени:
journalctl --since "2020-07-06 07:00:00" --until "2020-07-06 08:00:00"
А чтобы увидеть события с прошлого дня, используйте:
journalctl --since yesterday
Фильтр по службе (юниту)
Если вас интересуют только события определенной службы, вы можете воспользоваться командой:
journalctl -u имя_службы
При необходимости можно указать временные параметры. Например, чтобы посмотреть события Nginx за определенные часы, выполните:
journalctl -u nginx.service --since 10:00 --until 16:00
Также можно указать несколько юнитов:
journalctl -u nginx.service -u php-fpm.service --since today
Фильтр событий ядра
Вы можете вывести только события ядра, используя опцию -k:
journalctl -k -2
Фильтр по пользователю, группе или процессу
Вы также можете просматривать данные для конкретного PID, UID или GID:
journalctl _PID=идентификатор_процесса
journalctl _UID=идентификатор_пользователя
journalctl _GID=идентификатор_группы
Например, чтобы просмотреть только события, связанные с определенным процессом за текущий день, выполните следующую команду:
journalctl _PID=544 --since today
Для получения списка всех идентификаторов, для которых есть записи в журналах, используйте:
journalctl -F _UID
# Аналогично для GID:
journalctl -F _GID
Фильтр по приоритету
С опцией -p вы можете вывести события начиная с определенного уровня приоритета. Уровни включают:
- 0: emerg (авария, система неработоспособна)
- 1: alert (тревога, требуется немедленное внимание)
- 2: crit (критическое состояние)
- 3: err (ошибка)
- 4: warning (предупреждение)
- 5: notice (уведомление)
- 6: info (информация)
- 7: debug (отладка)
В команде можно указывать как название уровня, так и его числовое обозначение.
Например, следующей командой мы можем просматривать все события в текущей загрузке, имеющие уровень 3 (ошибка) и выше:
journalctl -p err -b
# Или:
journalctl -p 3 -b
Настройка отображения
Базовые настройки
Уменьшение ширины строк для совместимости с окном терминала:
journalctl --no-full
Вывод записей в стандартный вывод (позволяет обрабатывать записи с помощью других утилит, таких как grep, или сохранять в текстовый файл):
journalctl --no-pager
Форматы вывода
Спецификацию формата вывода можно указать с помощью -o:
journalctl -o формат
Доступные форматы:
- cat — только текст сообщений из логов, без дополнительной информации;
- export — бинарный формат, подходящий для экспорта или создания резервных копий журналов;
- json — стандартный формат .json с одной записью на строку;
- json-pretty или json-sse — удобочитаемый формат .json;
- short — формат вывода, аналогичный syslog;
- short-iso — формат вывода syslog с временными метками в ISO8601;
- short-monotonic — формат вывода syslog с монотонными временными метками;
- short-precise — формат вывода syslog с временем вплоть до микросекунд;
- verbose — максимально подробный вывод с дополнительной информацией.
Пример использования:
journalctl -b -u nginx.service -o json-pretty
Отображение недавних событий
По умолчанию будут выведены последние 10 событий:
journalctl -n
Количество событий можно уточнить, например:
journalctl -n 20
Вывод событий в режиме реального времени:
journalctl -f
Управление журналом
Занимаемый объем
Для определения объема, который занимает журнал на диске, выполните команду:
journalctl --disk-usage
Ограничение объема
Настройки для ограничения объема журнала можно задать, отредактировав его конфигурационный файл:
sudo nano /etc/systemd/journald.conf
Вы можете настроить следующие параметры:
- SystemMaxUse= Максимальный объем, который журнал может занимать на диске.
- SystemKeepFree= Объем, который должен оставаться свободным на диске после сохранения логов.
- SystemMaxFileSize= Максимальный размер файла журнала, при достижении которого он будет удален.
- RuntimeMaxUse= Максимальный объем, который логи могут занимать в файловой системе /run.
- RuntimeKeepFree= Объем, который должен оставаться свободным в файловой системе /run после сохранения логов.
- RuntimeMaxFileSize= Максимальный размер файла журнала, при достижении которого он будет удален из файловой системы /run.
Удаление старых записей
Для очистки старых записей и уменьшения объема журнала можно использовать два метода.
1. Можно указать желаемый объем, к которому следует сократить журнал. Это приведет к удалению старых записей до тех пор, пока объем журнала не достигнет указанного значения. Например:
sudo journalctl --vacuum-size=1G
2. Можно указать период времени, за который нужно сохранить данные. В этом случае все записи, старше указанного периода, будут удалены. Например:
sudo journalctl --vacuum-time=1year
Таким образом, будут удалены все записи, кроме тех, которые были созданы в течение последнего года.