5

systemd ライブラリ http://www.freedesktop.org/software/systemd/python-systemd/journal.htmlを使用して、Python でこのシェル コマンドをエミュレートしようとしています。

私は実際にこのコマンドをエミュレートしようとしていますが、Python 内です。

journalctl --since=-5m --no-pager

Python でジャーナル実行可能ファイルを呼び出してこれを行っている人を見てきましたが、これは非常に悪い方法です。

上記のリンク先のドキュメントに基づいて、この簡単なスクリプトを作成しました

import select
from systemd import journal

j = journal.Reader()
j.log_level(journal.LOG_INFO)
# j.add_match(_SYSTEMD_UNIT="systemd-udevd.service")

j.seek_tail()
j.get_next()

while j.get_next():
    for entry in j:
        if entry['MESSAGE'] != "":
            print(str(entry['__REALTIME_TIMESTAMP'] )+ ' ' + entry['MESSAGE'])

ここにはいくつかの問題があります

  1. ログは約 5 日前から始まっているようです。これは、seek_tail が機能していないように見えることを意味します。
  2. ここにたくさんのがらくたがあります。質問の冒頭で与えられたjournalctlコマンドから取得したデータと一致させるために使用する必要がある特定のフィルターはありますか?

理想的には、一連のフィルター/一致に基づいてこのジャーナルをフォローし、コマンド「journalctl -f」をエミュレートしたいのですが、最初にこの問題を解決する必要があります。私はこのようなものになりたいのですが、うまくいきません。

import select
from systemd import journal

j = journal.Reader()
j.log_level(journal.LOG_INFO)

# j.add_match(_SYSTEMD_UNIT="systemd-udevd.service")
j.seek_tail()

p = select.poll()
p.register(j, j.get_events())
while p.poll():

    while j.get_next():
        for entry in j:
            if entry['MESSAGE'] != "":
                print(str(entry['__REALTIME_TIMESTAMP'] )+ ' ' + entry['MESSAGE'])
4

2 に答える 2