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

8

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.*/"

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

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

Спасибо.

artfulrobot
источник

Ответы:

3

В настоящее время 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. [...]
    

    Страница man относится к шаблону только при описании -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. Исходный код

    Функция fnmatchin src/journalиспользуется только при поиске единиц .

  3. журнал отладки

    Включив отладочный вывод, вы увидите, что шаблон расширяется только при использовании -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*
    ...
    
Эмануэле Ди Джакомо
источник
1
Обратите внимание, что это на самом деле реализовано в последнем выпуске systemd github.com/systemd/systemd/commit/…
Bigon