systemd's journalctl: Wie filtere ich nach Nachrichten?

8

journalctl sieht aus wie ein großartiges Werkzeug zum Durchsuchen von Protokollen, aber ich bleibe bei einer einfachen Frage: Ich möchte alle Cron-Nachrichten sehen, die die Phrase enthalten update-ipsets.

Natürlich kann ich das machen

journalctl -u cron.service | grep update-ipsets

Aber dann verlieren Sie alle anderen Vorteile der Ausgabe von journalctl (Farbcodierung, automatisches Paging, Live-Ansicht usw.).

Ich habe es versucht:

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

Und Sie wollen nicht Experiment durch Schlagen tabnach MESSAGE=- hängt die (zsh / Debian Jessie) Shell und Ctrl-Chat nicht geholfen entweder!

Ich kann nicht glauben, dass diese grundlegende Funktionalität nicht integriert ist, also bin ich sicher, dass ich etwas verpasst habe?

Vielen Dank.

Kunstroboter
quelle

Antworten:

3

Derzeit unterstützt journalctl keine Muster oder Platzhalter in Feldübereinstimmungen. grepist Ihre beste Option.

Ich hatte das gleiche Problem und denke, dass journalctlnur dann nach einer genauen Übereinstimmung für VALUE gesucht wird, wenn dies NAME=VALUEals Argumente übergeben wird.

Meine Untersuchungen:

  1. Manpage

    Von journalctl(1)

    Das Muster wird in der Beschreibung der Übereinstimmungen nicht erwähnt:

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

    Die Manpage verweist auf ein Muster, wenn nur die -uOption beschrieben wird .

       -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. Quellcode

    Die Funktion fnmatchin src/journalwird nur bei der Suche nach Einheiten verwendet .

  3. debug journalctl

    Wenn Sie die Debug-Ausgabe aktivieren, können Sie sehen, dass das Muster nur bei Verwendung erweitert wird -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)
    ...
    

    Alle Übereinstimmungen werden als genau behandelt, einschließlich UNIT:

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 UNIT=gdm.*
    ...
    Journal filter: UNIT=gdm*
    ...
    
Emanuele Di Giacomo
quelle
1
Beachten Sie, dass dies tatsächlich in der letzten systemd-Version implementiert ist. Github.com/systemd/systemd/commit/…
Bigon