Назад | Перейти на главную страницу

systemd journalctl: как фильтровать по сообщениям?

journalctl выглядит как отличный инструмент для просмотра журналов, но я застрял на том, что похоже на простой вопрос: я хочу видеть все сообщения cron, содержащие фразу update-ipsets.

Конечно я могу это сделать

journalctl -u cron.service | grep update-ipsets

но тогда вы теряете все другие преимущества вывода journalctl (цветовое кодирование, автопейджинг, просмотр в реальном времени и т. д.)

Я пробовал:

journalctl -u cron.service MESSAGE=update-ipsets
journalctl -u cron.service "MESSAGE=*update-ipsets*"
journalctl -u cron.service "MESSAGE=.*update-ipsets.*"
journalctl -u cron.service "MESSAGE=/.*update-ipsets.*/"

И вы не хотите экспериментировать, нажимая вкладка после MESSAGE= - зависает оболочка (zsh / Debian Jessie) и Ctrl-C тоже не помогло!

Я как бы не могу поверить, что в него не встроена эта базовая функциональность, поэтому я уверен, что что-то пропустил?

Спасибо.

В настоящее время journalctl не поддерживает шаблоны или подстановочные знаки в совпадениях полей. grep ваш лучший вариант.

У меня была такая же проблема, и я думаю, что journalctl только ищет точное совпадение для VALUE, когда NAME=VALUE передается как аргументы.

Мои расследования:

  1. страница руководства

    Из journalctl(1)

    Шаблон не упоминается в описании матчей:

     [...] A match is in the format "FIELD=VALUE", e.g.
     "_SYSTEMD_UNIT=httpd.service", referring to the components
     of a structured journal entry. [...]
    

    Страница руководства ссылается на шаблон при описании -u только вариант.

       -u, --unit=UNIT|PATTERN
           Show messages for the specified systemd unit UNIT 
           (such as a service unit), or for any of the units
           matched by PATTERN. 
    
  2. Исходный код

    Функция fnmatch в src/journal используется только при поиске объектов.

  3. отладить journalctl

    Включив вывод отладки, вы увидите, что шаблон расширяется только при использовании -u.

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 -u gdm*
    ...
    Matched gdm.service with pattern _SYSTEMD_UNIT=gdm*
    Matched gdm.service with pattern UNIT=gdm*
    Journal filter: ((OBJECT_SYSTEMD_UNIT=gdm.service AND _UID=0) OR (UNIT=gdm.service AND _PID=1) OR (COREDUMP_UNIT=gdm.service AND _UID=0 AND MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1) OR _SYSTEMD_UNIT=gdm.service)
    ...
    

    Все совпадения считаются точными, в том числе UNIT:

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 UNIT=gdm.*
    ...
    Journal filter: UNIT=gdm*
    ...