Page tree

Системный менеджер systemd присутствует в большинстве современных Linux-дистрибутивов, в том числе, в Ubuntu, Debian и CentOS. С помощью systemd выполняется управление сервером и службами (например, их запуск и остановка), а также — ведение логов. В журнал 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, todaynow (вчера, сегодня, сейчас)

Например, вывод событий с указанного времени по текущий момент:

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

Фильтр событий ядра

Можно отдельно вывести только события kernel. Для этого используется -k.

Например, чтобы просмотреть такие события в одной из предыдущих загрузок, выполним:

journalctl -k -2

Фильтр по пользователю, группе или процессу

Есть возможность просматривать данные для конкретного PID, UID, GID:

journalctl _PID=id_процесса
 
journalctl _UID=id_пользователя
 
journalctl _GID=id_группы

Например, чтобы вывести только сегодняшние события, связанные с определенным процессом, выполним:

journalctl _PID=544 --since today

Получить список всех ID, записи о которых есть в логах, можно с помощью:

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=1years

    В этом случае будут удаляться все записи, кроме тех, что были созданы за последний год.

  • No labels