Системный менеджер 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,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=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
В этом случае будут удаляться все записи, кроме тех, что были созданы за последний год.