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