journalctl de systemd: comment filtrer par message?

8

journalctl ressemble à un excellent outil pour parcourir les journaux, mais je suis bloqué sur ce qui ressemble à une simple demande: je veux voir tous les messages cron qui contiennent la phrase update-ipsets.

Bien sûr, je peux le faire

journalctl -u cron.service | grep update-ipsets

mais alors vous perdez tous les autres avantages de la sortie de journalctl (codage couleur, pagination automatique, affichage en direct, etc.)

J'ai essayé:

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

Et vous ne voulez pas expérimenter en appuyant sur tabaprès MESSAGE=- bloque le shell (zsh / Debian Jessie) et Ctrl-Cn'a pas aidé non plus!

Je ne peux pas croire qu'il ne dispose pas de cette fonctionnalité de base, donc je suis sûr que j'ai dû manquer quelque chose?

Merci.

artfulrobot
la source

Réponses:

3

Actuellement, journalctl ne prend pas en charge les modèles ou les caractères génériques dans les correspondances de champs. grepest votre meilleure option.

J'ai eu le même problème, et je pense que journalctlrecherche uniquement une correspondance exacte pour VALUE quand NAME=VALUEest passé comme arguments.

Mes investigations:

  1. page de manuel

    De journalctl(1)

    Le motif n'est pas mentionné dans la description des correspondances:

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

    La page de manuel fait référence à un modèle lors de la description de l' -uoption uniquement.

       -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. Code source

    La fonction fnmatchdans src/journalest utilisée lors de la recherche d'unités uniquement .

  3. debug journalctl

    En activant la sortie de débogage, vous pouvez voir que le modèle est développé uniquement lors de l'utilisation -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)
    ...
    

    Tous les matchs sont traités comme exacts, y compris UNIT:

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 UNIT=gdm.*
    ...
    Journal filter: UNIT=gdm*
    ...
    
Emanuele Di Giacomo
la source
1
Notez que cela est réellement implémenté dans la dernière version de systemd github.com/systemd/systemd/commit/…
Bigon