Systemdログファイルから統計情報を収集する必要があります。たとえば、特定のクエリ文字列パラメーターをサービスに渡すユーザーの数などです。この情報をjournalctlで表示できることはわかっていますが、Go(またはPython)でデータを集計できるようにする方法がわかりません。このためのライブラリを探していましたが、何も見つからないようで、ログファイルが実際に格納されている場所がわかりません。
Journal APIを使用して、systemdジャーナルにプログラムでアクセスできます。
または、ホスト上でsystemd-journal-gatewaydサービスを実行することを検討することもできます。これは、HTTPサーバーを介してジャーナルデータをエクスポートします。この場合、別の言語のHTTPクライアント実装を使用して、ジャーナルを直接クエリできます。
公式のJournal APIはsystemd自体の一部として提供され、journalctlの実装に使用されます。これはC APIです。
このAPIは、systemd-journaldが/var/log/journal
または/run/log/journal
の下に直接書き込んだファイルにアクセスするため、これらの場所から読み取るには適切な権限が必要です。つまり、通常はコードをrootとして実行する必要があります。
このAPIでは、systemdライブラリにリンクし、実行時にそれらを使用できるようにする必要もあります。コンパイルしてリンクできるようにするには、Ubuntu 18.04システムにlibsystemd-dev
パッケージをインストールする必要があります。
Sudo apt-get install libsystemd-dev
このAPIの一般的な概要については、 sd-journal(3) のマニュアルページを参照してください。ジャーナルをクエリするより具体的なケースについては、 sd_journal_next(3) (完全な単純なプログラムを使用したniceの例を含む)、および sd_journal_add_match(3) を参照して、取得する一致(ジャーナルクエリを効果的に実装します。)また、 sd_journal_get_data(3) 、 sd_journal_open(3) なども必要ですが、これらのポインタを使用すると、ジャーナルに直接アクセスします。)
Journal APIのバインディングを含む、公式のsystemdプロジェクトのsystemdには Pythonバインディング があります。
これらのモジュールは、Ubuntu 18.04パッケージとしても利用可能で、次のようにインストールできます。
Sudo apt-get install python3-systemd
... Python 3(推奨)、またはPython 2を使用する必要がある場合:
Sudo apt-get install python-systemd
systemd.journal
モジュールのReader
クラスのドキュメントを参照 コードdocstringsで 。このクラスは、ジャーナルへの読み取りアクセスを提供します。これは、おそらくあなたが興味を持っているものです。
github.com/coreos/go-systemd モジュールには、systemdライブラリのGoバインディングがあります。
フィルタリングのための一致を含む、ジャーナルからの読み取りについて、sdjournal
サブモジュール、特にJournalReader
タイプを見てください。あなたはそれについてもっと知ることができます ソースコードから
Journal APIを使用してジャーナルファイルに直接アクセスする代わりに、HTTPサーバーを介してそれらをエクスポートするサービスを実行することもできます。 Systemdは systemd-journal-gatewayd を通じてこのようなサービスを提供します。
このプログラムはUbuntu 18.04でsystemd-journal-remoteパッケージの一部として利用できるため、次のコマンドを使用してインストールおよび有効化できます。
Sudo apt-get install systemd-journal-remote
Sudo systemctl enable --now systemd-journal-gatewayd
ジャーナルの参照とクエリに使用できるポート19531でHTTPサーバーをエクスポートします。
systemd-journal-gatewayd.service(8) のmanページの詳細を参照してください。これには、curlを使用してアクセスする方法の例が含まれています。独自のネイティブ Journal Export Format を使用して、JSONまたはsyslogのようなプレーンテキストとしてデータをエクスポートできます。
Systemd-journal-gatewaydルートを使用する場合は、HTTPサーバーを介してログデータをエクスポートすることのセキュリティへの影響を理解してください。少なくとも、localhostのみでポートを公開することを検討してください。
journalctl
は/var/log/syslog
のサブセットを取得すると思います。そのサブセットはそれが知っているものです。これは観察によるものです。パラメータなしでjournalctl
を実行すると、すべてのログが表示されます。 q
を押して終了し、tail /var/log/syslog
を実行します。同じ出力に気づくでしょうが、syslog
ファイルの情報にはjournalctl
出力よりも多くの情報が含まれています。
したがって、以下のコメントに照らして、syslogがインストールされていることを確認し、/var/log/syslog
を解析して必要なものを見つけることができます。 /var/log/
の独自のログにサービス(それが何であるか不明)を書き込むこともできます。