Skip to content

Latest commit

 

History

History
143 lines (123 loc) · 5.38 KB

10009.journalctl.md

File metadata and controls

143 lines (123 loc) · 5.38 KB

journalctl - Работа со структурированными логами

Журнал событий, это компонент 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""