Expertus metuit
journalctl
Опубликовано 2024-09-23 в 14:30

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

Комментарии

Текст комментария (допустимая разметка: *курсив*, **полужирная**, [ссылка](http://example.com) или <http://example.com>) Посетители-анонимы, обратите внимение, что более чем одна гиперссылка в тексте (включая оную из поля «веб-сайт») приведёт к блокировке комментария для модерации. Зайдите на сайта с использованием аккаунта на twitter, например, чтобы посылать комментарии без этого ограничения.
Имя (обязательно, 50 символов или меньше)
Опциональный email, на который получать ответы (не будет опубликован)
Веб-сайт
© 2006—2024 Sergey Stolyarov | Работает на pyrengine