web-dev-qa-db-ja.com

journalctlログの信頼できるエクスポート

Journalctlログの信頼できるエクスポートの方法を検索します。

--since=...オプションを使用することもできますが、これは少しあいまいです。

私の場合、スクリプトは10分ごとにjournalctl --output=jsonを呼び出します。

1行を見逃したくありません(可能な場合)行の重複を避けたいです。

この質問をした数日後、RELPに遭遇しました: https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol

4
guettli

Rsyslog(Red Hat派生システムのデフォルト)などのsyslogデーモンをインストールできます。これにより、下位互換性のある方法ですべてのジャーナルエントリがログに記録されます。もちろん、必要に応じてカスタムログを指定できます。

ログをリアルタイムでエクスポートする必要がない場合は、journalctl --sinceを使用できます。時間指定子yesterdayを使用して毎日午前0時に実行すると、正確に24時間のログを取得できます。


本当に短い間隔でログを取得する必要があり、単一のエントリを見逃したくない場合は、cursorについて学ぶ必要があります。各ログエントリに対して、journalctlはカーソルを提供し、--cursorを使用してそのログエントリ、または--after-cursorを使用してその直後のログエントリにスキップするために使用できます。次のサンプルJSONを考えてみます。

{
    "__CURSOR" : "s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc",
    "__REALTIME_TIMESTAMP" : "1512234682620466",
    "__MONOTONIC_TIMESTAMP" : "304802790693",
    "_BOOT_ID" : "6b134acc25e94d69b4713422b7c773be",
    "PRIORITY" : "6",
    "_MACHINE_ID" : "770056613d554df2abcb7757ba2e6270",
    "_HOSTNAME" : "dalaran.example.us",
    "_PID" : "1",
    "_UID" : "0",
    "_SELINUX_CONTEXT" : "system_u:system_r:init_t:s0",
    "_GID" : "0",
    "_CAP_EFFECTIVE" : "3fffffffff",
    "SYSLOG_FACILITY" : "3",
    "SYSLOG_IDENTIFIER" : "systemd",
    "_TRANSPORT" : "journal",
    "_COMM" : "systemd",
    "_EXE" : "/usr/lib/systemd/systemd",
    "_CMDLINE" : "/usr/lib/systemd/systemd --switched-root --system --deserialize 25",
    "_SYSTEMD_CGROUP" : "/init.scope",
    "_SYSTEMD_UNIT" : "init.scope",
    "_SYSTEMD_SLICE" : "-.slice",
    "CODE_FILE" : "../src/core/unit.c",
    "CODE_LINE" : "1505",
    "CODE_FUNC" : "unit_status_log_starting_stopping_reloading",
    "MESSAGE_ID" : "de5b426a63be47a7b6ac3eaac82e2f6f",
    "MESSAGE" : "Stopping OpenSSH server daemon...",
    "UNIT" : "sshd.service",
    "_SOURCE_REALTIME_TIMESTAMP" : "1512234682615526"
}

目的のために、__CURSORは不透明なblobです。 journalctlへの1回の呼び出しで受け取るlastログエントリから値をキャプチャし、それをnext呼び出しにフィードします。

journalctl --output=json --after-cursor="s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc" ...
7
Michael Hampton

--sinceオプションを使用します。過去10分間のログを取得するには、次のコマンドを使用します。

--since -10m

これにより、現在時刻の10分前のログが得られます。 mand https://www.freedesktop.org/software/systemd/man/journalctl.html と、systemd https://www.freedesktop。 org/software/systemd/man/systemd.time.html#

1
Mike Marseglia

python query_unique関数を使用して、journalctlをポーリングするためのスクリプトを作成できます。おそらく、サービスとして実行すると、再起動オプションを使用して、何かを見逃さないようにできます。

https://www.freedesktop.org/software/systemd/python-systemd/journal.html

0
Alex Bender

これを行う1つの方法(あまり信頼性は高くありませんが、機能します):

$ crontab -l | tail -1
*/10 * * * * journalctl --output=json --since -10m >> journalctl.json
$ 

それを行う別の方法; (json出力をelasticsearchにインポートする必要があると想定):

0
alexus

syslog-ngはジャーナルから読み取り、プレーンテキストファイルにエクスポートできます。 syslog-ngを設定して、他のシステム(elasticsearchを含む)にデータを送信することもできます。

0
cstamas