systemd's journalctl: bagaimana cara memfilter berdasarkan pesan?

8

journalctl terlihat seperti alat yang hebat untuk melihat log, tapi saya terjebak pada apa yang terasa seperti pertanyaan sederhana: Saya ingin melihat semua pesan cron yang mengandung frasa update-ipsets.

Tentu saja saya bisa melakukan ini

journalctl -u cron.service | grep update-ipsets

tetapi kemudian Anda kehilangan semua manfaat lain dari output jurnalctl (kode warna, paging otomatis, tayangan langsung, dll.)

Saya sudah mencoba:

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

Dan Anda tidak ingin bereksperimen dengan memukul tabsetelah MESSAGE=- menggantung shell (zsh / Debian Jessie) dan Ctrl-Cjuga tidak membantu!

Saya agak tidak percaya bahwa ia tidak memiliki fungsi dasar ini, jadi saya yakin saya pasti melewatkan sesuatu?

Terima kasih.

artfulrobot
sumber

Jawaban:

3

Saat ini, journalctl tidak mendukung pola atau wildcard dalam pertandingan lapangan. grepadalah pilihan terbaik Anda.

Saya memiliki masalah yang sama, dan saya pikir itu journalctlhanya mencari kecocokan tepat untuk VALUE ketika NAME=VALUEdilewatkan sebagai argumen.

Investigasi saya:

  1. halaman manual

    Dari journalctl(1)

    Polanya tidak disebutkan dalam deskripsi pertandingan:

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

    Halaman manual mengacu pada pola saat -uhanya menjelaskan opsi.

       -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. Kode sumber

    Fungsi fnmatchdalam src/journaldigunakan saat mencari unit saja .

  3. debug jurnalctl

    Mengaktifkan hasil debug Anda dapat melihat bahwa polanya hanya diperluas saat menggunakan -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)
    ...
    

    Semua pertandingan diperlakukan sebagai tepat, termasuk UNIT:

    $ SYSTEMD_LOG_LEVEL=debug journalctl -n1 UNIT=gdm.*
    ...
    Journal filter: UNIT=gdm*
    ...
    
Emanuele Di Giacomo
sumber
1
Perhatikan bahwa ini sebenarnya diimplementasikan dalam rilis systemd terakhir github.com/systemd/systemd/commit/…
Bigon