journalctl do systemd: como filtrar por mensagem?

8

O journalctl parece uma ótima ferramenta para examinar os logs, mas estou atento ao que parece ser uma simples pergunta: quero ver todas as mensagens cron que contenham a frase update-ipsets.

Claro que posso fazer isso

journalctl -u cron.service | grep update-ipsets

mas você perde todos os outros benefícios da saída do journalctl (código de cores, paginação automática, exibição ao vivo etc.)

Eu tentei:

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

E você não quer experimentar pressionando tabdepois MESSAGE=- trava o shell (zsh / Debian Jessie) e Ctrl-Ctambém não ajudou!

Eu meio que não acredito que ele não tem essa funcionalidade básica incorporada, então tenho certeza de que devo ter perdido alguma coisa?

Obrigado.

artfulrobot
fonte

Respostas:

3

Atualmente, o journalctl não suporta padrões ou curingas em correspondências de campo. grepé a sua melhor opção.

Eu tive o mesmo problema e acho que journalctlsó procura uma correspondência exata para VALUE quando NAME=VALUEé passado como argumento.

Minhas investigações:

  1. página de manual

    De journalctl(1)

    O padrão não é mencionado na descrição das correspondências:

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

    A página de manual refere-se a um padrão ao descrever -uapenas a opção.

       -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. Código fonte

    A função fnmatchin src/journalé usada ao procurar apenas unidades .

  3. debug journalctl

    Ativando a saída de depuração, você pode ver que o padrão é expandido apenas ao usar -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)
    ...
    

    Todas as correspondências são tratadas como exatas, incluindo UNIT:

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 UNIT=gdm.*
    ...
    Journal filter: UNIT=gdm*
    ...
    
Emanuele Di Giacomo
fonte
1
Observe que isso é realmente implementado na última versão do systemd github.com/systemd/systemd/commit/…
Bigon