Журнал событий, это компонент systemd, который захватывает сообщения Syslog, логи ядра, все события при инициализации системы (RAM, диск, boot, STDOUT/STDERR для всех сервисов), индексирует их и затем предоставляет удобной пользовательский интерфейс для поиска и фильтрации логов. Журнал (systemd journal) можно использовать вместе или вместо syslog или syslog-ng.
Журнал systemd сохраняется на диск, поэтому все логи «переживают» перезагрузку системы. Посмотреть список с доступными загрузками:
journalctl --list-boots |head -n2
journalctl --list-boots |tail -n2
Команда journalctl –b покажет все логи для текущей загрузки. Если необходимы логи какого-то определенного периода, то нужно добавить в качестве аргумента номер загрузки:
journalctl -b -1
Для того, чтобы получить все логи для текущей загрузки в обратном хронологическом порядке:
journalctl -b --all --catalog --no-pager
Все логи за все время в одном файле:
journalctl --all --catalog --merge --no-pager
Текущая загрузка, только логи ядра:
journalctl -b -k --no-pager
Для того, чтобы можно было отслеживать логи в режиме реального времени (похоже на tail –f):
journalctl -f
Просмотреть сколько места занимают журналы systemd на диске (/var/log/journal/):
journalctl --disk-usage
Получить логи и метаданные:
journalctl --output verbose
Экспорт логов в файл:
journalctl --output export > export.log
Фильтрация логов Можно фильтровать логи по приоритету (RFC 5424 6.2.1):
journalctl -f -p emerg
journalctl -f -p alert
journalctl -f -p crit
journalctl -f -p err
journalctl -f -p warning
journalctl -f -p notice
journalctl -f -p info
journalctl -f -p debug
Вывести только логи c приоритетом error, critical и alert:
journalctl -p err..alert
Логи только для определенного идентификатора:
journalctl -t NetworkManager
journalctl можно использовать вместе с стандартными инструментами командной строки - grep, awk:
journalctl -b | grep -i selinux
Для того, чтобы сократить время лучше использовать флаг -g или --grep:
journalctl -g nginx
journalctl -b -g kube
journalctl -g fail --case-sensitive=true
Как и grep --grep «понимает» регулярные выражения:
journalctl --grep '(Started|Stopping)'
Позволяет отфильтровывать логи по временным штампам, без grep, awk и sed. Не нужно запоминать сложные регулярные выражения:
journalctl --since "20 min ago"
Если у вас геораспределенная инфраструктура в разных часовых поясах, то journalctl поможет с разными часовыми поясами:
journalctl --since "2023-06-21 14:24 Pacific/Auckland" --until "2023-06-21 14:30 Europe/Amsterdam"
Журнал systemd сохраняет логи в структурированном формате:
journalctl -o verbose --no-pager
Sat 2023-07-22 17:17:40.468870 MSK [s=8e997e4278d4420da4ee36deb1bcb537;i=48abc;b=200a318f51b04680a1207f58ed5aaf88;m=2199c4e719;t=601140b4770a0;x=59dabeebe46afe51]
_TRANSPORT=syslog
PRIORITY=6
SYSLOG_IDENTIFIER=sshd
_UID=0
_GID=0
_COMM=sshd
_EXE=/usr/sbin/sshd
_CAP_EFFECTIVE=1ffffffffff
_SELINUX_CONTEXT=system_u:system_r:sshd_t:s0-s0:c0.c1023
_SYSTEMD_CGROUP=/system.slice/sshd.service
_SYSTEMD_UNIT=sshd.service
_SYSTEMD_SLICE=system.slice
_SYSTEMD_INVOCATION_ID=2c28dd046868493ca6c4ae9325b237b9
_BOOT_ID=200a318f51b04680a1207f58ed5aaf88
_MACHINE_ID=b0900a09b82b4ecca86af861e99e64c5
_HOSTNAME=Pythagoras
_RUNTIME_SCOPE=system
SYSLOG_FACILITY=10
_CMDLINE="sshd: unknown [priv]"
SYSLOG_PID=1339341
_PID=1339341
SYSLOG_TIMESTAMP=Jul 22 17:17:40
MESSAGE=Connection closed by invalid user ubuntu 45.95.147.231 port 53778 [preauth]
Журнал systemd сохраняет логи в структурированном формате:
journalctl _PID=1339341
Или например посмотреть логи всех программ написанных на питоне:
journalctl _COMM=python
journalctl умеет выводить логи в формате json – можно использовать утилиту jq для фильтрации сообщений:
journalctl --since "1500 min ago" -u kubelet.service -o json | jq .""_CMDLINE""