journalctl — это инструмент запросов и поиска в логах systemd. А это шпаргалка по journalctl, так как теперь им приходится часто пользоваться, а команды запоминаются с трудом, так как их много и они не особо интуитивные или логичные.
Сами логи в systemd структурированные, а journalctl умеет выводить записи из него в разных форматах. Формат можно менять через аргумент -o
, всего их довольно много, включая json; если аргумент -o
не указывать, то подразумевается -o short
.
По умолчанию (то есть в режиме вывода -o short
) journalctl выводит логи в текстовом виде, максимально приближенном к формату syslog:
сен 23 10:28:19 sigsergv-ws kwin_x11[982965]: qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 15025, resource id: 18766990, major code: 2 (ChangeWindowAttributes), minor code: 0
Нигде в документации я не нашёл описаний, из каких именно элементов состоит вывод в текстовом формате -o short
, это можно достоверно узнать только из исходного кода systemd (это файл src/shared/logs-show.c
, функция output_short
). В нашем случае он состоит из такого:
$timestamp $hostname $sys_id[$pid]: $message
$timestamp
(сен 23 10:28:19
) — это время записи, отформатированное для текущей локали$hostname
(sigsergv-ws
) — название хоста машины$sys_id
(kwin_x11
) — условный системный идентификатор процесса/сервиса, который отправил запись в лог, условный потому, что здесь может быть одно из двух возможных значений (поля из полной структуры записиSYSLOG_IDENTIFIER
,_COMM
), какой из них первым определён, тот и печатается$pid
(982965
) — PID процесса, который отправил запись в лог$message
(qt.qpa.xcb: QXcbConnection: XCB error....
) — собственно текстовая часть сообщения, она уже не имеет предопределённой структуры и печатается как есть
──────────────────
Чтобы посмотреть все поля из каждой записи, нужно выбрать режим вывода -o json
(весь JSON печатается одной строкой для каждой записи) или -o json-pretty
(каждая запись печатается с отступами). Или -o verbose
, в нём тоже выдаются все значения с отступами, но в немного обработанном виде.
──────────────────
Простой вызов journalctl происходит в интерактивном режиме, позволяющем двигать «окно» с результатами примерно так же, как это делается в less, например: shift-g
перемещает в конец лога, g
— в начало, PageUp
/PageDown
— переход на страницу вверх/вниз соответственно. q
— выход.
Также настоятельно рекомендую системным пейджером выставить less
, а не more
:
sudo apt install less
sudo update-alternatives --config pager
Выводить время записей с указанием года¶
$ journalctl -o short-iso
Вывести N свежих записей¶
Например, чтобы вывести пять последних (крайних, то есть самых свежих) записей:
$ journalctl -n 5
Выводить записи по мере их поступления¶
Запущенная в таком режиме команда будет выводить записи по мере их поступления, чтобы прервать, нажмите ctrl+c:
$ journalctl -f
Открыть на последней (самой свежей) записи¶
По такой команде лог открывается сразу на последней записи:
$ journalctl -e -nall
Если аргумент -nall
не указать, то будет подгружено по умолчанию только 1000 последних записей и при скроллинге вверх дальше этих 1000 уйти не получится.
Выводить записи только для конкретного компонента¶
Например, вы смотрите весь лог и видите, что проблемы идут от компонента kwin_x11 (как в примере выше). Чтобы показать записи только с ним, нужно добавить такой фильтр в аргумент запуска команды:
$ journalctl SYSLOG_IDENTIFIER=kwin_x11
Чтобы смотреть записи для компонента по мере их возникновения, добавьте флаг -f
:
$ journalctl -f SYSLOG_IDENTIFIER=kwin_x11
Другие элементы фильтра (типа SYSLOG_IDENTIFIER
) можно посмотреть, если запустить в формате вывода verbose, тогда записи будут выводиться с полной детализацией для всех элементов:
$ journalctl --output=verbose -f
Tue 2024-10-10 08:00:08.642600 MSK [s=xxxxxxxxxxxx;i=xxxxxx;b=xxxxxxxxxxxx;m=xxxxxxxxxx;t=xxxxxxxxxx;x=xxxxxx]
_TRANSPORT=stdout
PRIORITY=6
SYSLOG_FACILITY=3
_UID=1001
_GID=1001
_CAP_EFFECTIVE=0
_SELINUX_CONTEXT=unconfined
_AUDIT_SESSION=1
_AUDIT_LOGINUID=1001
_SYSTEMD_OWNER_UID=1001
[email protected]
_SYSTEMD_SLICE=user-1001.slice
_SYSTEMD_USER_SLICE=app.slice
_MACHINE_ID=xxxxxxxxxx
_HOSTNAME=stolyarov-nb
_RUNTIME_SCOPE=system
SYSLOG_IDENTIFIER=krunner
_BOOT_ID=xxxxxxxxxx
_STREAM_ID=xxxxxxxxxx
_COMM=electron
_EXE=/usr/lib/yandex-music/electron/electron
_CMDLINE="/usr/lib/yandex-music/electron/electron --no-sandbox /usr/lib/yandex-music/yandex-music.asar"
_PID=2477559
_SYSTEMD_CGROUP=/user.slice/user-1001.slice/[email protected]/app.slice/app-yandex\x2dmusic-xxxxxxxxxx.scope
_SYSTEMD_USER_UNIT=app-yandex\x2dmusic-xxxxxxxxxx.scope
_SYSTEMD_INVOCATION_ID=xxxxxxxxxx
MESSAGE=[10.10.2024, 08:00:08,641] [info] (UpdateLogger) Updater is inactive