Помощь

Системное логирование с использованием 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

Таким образом, будут удалены все записи, кроме тех, которые были созданы в течение последнего года.

Остались вопросы - пишите