web-dev-qa-db-ja.com

journalctlの外部でjournalctlログを分析するにはどうすればよいですか?

Systemdログファイルから統計情報を収集する必要があります。たとえば、特定のクエリ文字列パラメーターをサービスに渡すユーザーの数などです。この情報をjournalctlで表示できることはわかっていますが、Go(またはPython)でデータを集計できるようにする方法がわかりません。このためのライブラリを探していましたが、何も見つからないようで、ログファイルが実際に格納されている場所がわかりません。

2
user_78361084

Journal APIを使用して、systemdジャーナルにプログラムでアクセスできます。

または、ホスト上でsystemd-journal-gatewaydサービスを実行することを検討することもできます。これは、HTTPサーバーを介してジャーナルデータをエクスポートします。この場合、別の言語のHTTPクライアント実装を使用して、ジャーナルを直接クエリできます。

Journal API

公式の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) なども必要ですが、これらのポインタを使用すると、ジャーナルに直接アクセスします。)

Pythonバインディング

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のみでポートを公開することを検討してください。

5
filbranden

journalctl/var/log/syslogのサブセットを取得すると思います。そのサブセットはそれが知っているものです。これは観察によるものです。パラメータなしでjournalctlを実行すると、すべてのログが表示されます。 qを押して終了し、tail /var/log/syslogを実行します。同じ出力に気づくでしょうが、syslogファイルの情報にはjournalctl出力よりも多くの情報が含まれています。

したがって、以下のコメントに照らして、syslogがインストールされていることを確認し、/var/log/syslogを解析して必要なものを見つけることができます。 /var/log/の独自のログにサービス(それが何であるか不明)を書き込むこともできます。

0
Jacob Degeling