Шпаргалка по journalctl, так как теперь им приходится пользоваться, а команды запоминаются с трудом, так как их много и они не особо адекватные.
journalctl — это инструмент запросов и поиска в логах systemd. Я предоплагаю, что вы знаете, что такое systemd и логи, поэтому не буду лить воду по этой теме и сразу перейду к делу.
Главная моя проблема — не понимаю, какие данные и с какой структурой выводит эта программа.
Сами логи в 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
— выход.
Выводить время записей с указанием года¶
journalctl -o short-iso
Вывести N свежих записей¶
Например, чтобы вывести пять последних (то есть самых свежих) записей:
journalctl -n 5
Выводить записи по мере их поступления¶
Запущенная в таком режиме команда будет выводить записи по мере их поступления, чтобы прервать, нажмите ctrl+c:
journalctl -f
Открыть на последней (самой свежей) записи¶
По такой команде лог открывается сразу на последней записи:
journalctl -e
Выводить записи только для конкретного компонента¶
Например, вы смотрите весь лог и видите, что проблемы идут от компонента kwin_x11 (как в примере выше). Чтобы показать записи только с ним, нужно добавить такой фильтр в аргумент запуска команды:
journalctl _COMM=kwin_x11
Чтобы смотреть записи для компонента по мере их возникновения, добавьте флаг -f
:
journalctl -f _COMM=kwin_x11