journalctl do systemd: como filtrar por mensagem?

7

journalctl parece uma ótima ferramenta para procurar em logs, mas estou preso o que parece ser um simples perguntar: eu 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 depois você perde todos os outros benefícios da saída do journalctl (codificação por cores, paginação automática, visualizaçã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 apertando a aba depois que MESSAGE= - trava o shell (zsh / Debian Jessie) e Ctrl-C não ajudou ou!

Eu meio que não consigo acreditar que não tenha essa funcionalidade básica embutida, então tenho certeza que devo ter perdido alguma coisa?

Obrigado.

    
por artfulrobot 09.02.2016 / 11:41

1 resposta

3

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

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

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 man se refere a um padrão ao descrever apenas a opção -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. Código-fonte

    A função fnmatch in src/journal é usado ao pesquisar apenas unidades .

  3. debug journalctl

    Ativando a saída de depuração, você pode ver que o padrão é expandido somente quando 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*
    ...
    
por 05.10.2016 / 10:35