Journalctlにタイムスタンプとメッセージのみを印刷する

Journalctlにタイムスタンプとメッセージのみを印刷する

私は私ですjournalctlconkyjournalctljournalctl -u PROCESS -n 5 --no-pager -l

DATE TIME HOSTNAME PROCESS: MESSAGE

ただ印刷したいのですが、TIME MESSAGEどうすればいいですか?


マンページには引数があることが示されていますが、-o私のニーズに合った事前定義された形式はありません。を追加しようとしましたが--output-fields=__REALTIME_TIMESTAMP,MESSAGE(タイムスタンプ/メッセージの代わりに)、デフォルトの出力のみが表示されます。主張では、特定の形式だけが影響を受けると主張してこれを試みましたが、通常の冗長な--output-fields=__REALTIME_TIMESTAMP,MESSAGE -o verbose出力のみが提供されました。また、常に印刷されるフィールドが4つあります。これはすでに私には多すぎます。私は2つだけほしい: 簡潔なタイムスタンプおよびメッセージ。

bashの魔法やPythonスクリプトを使ってクリーンアップできますが、あまりにも過度のようです。もちろん、Journalctlにタイムスタンプとメッセージだけを要求する方法はありますか?

答え1

journalctl --output cat

cat
               generates a very terse output, only showing the actual message of each journal entry with no metadata, not even a timestamp. If combined with the --output-fields= option will output the listed fields for each log
               record, instead of the message.

答え2

journalctlタイムスタンプとメッセージのみを提供するように要求する方法はありますか?

カント。現在(2023年11月)基準では、後処理journalctlなしに時間とメッセージのみを出力することはできません。欲しいものに一番近いのは

journalctl --no-hostname -o short-full

これが十分でない場合、DATE TIME PROCESS: MESSAGE
唯一のオプションは他のツールを使用してそのデータを抽出/フォーマットすることです。ユーザーと同様に、これらのモードのいずれかを使用するか、出力モードを使用してタイムスタンプとメッセージのみを抽出
できます(タイムスタンプのみを時間に変換)。journalctljsonexportディーン・レジン ここに表示通過するjq
また、使用可能なバインディングの1つを使用しsystemd、ユーザーが提案したようにそのデータをインポートするためのツールを直接作成することもできます。マクシココメント(例:python systemd.journal
最後にメッセージをリアルタイムで表示するには、モードjournalctlで使用し、次のように行がfollow印刷されるたびにタイムスタンプを前に追加できます。tsmoreutils

journalctl -f -o cat | ts '%H:%M:%S'

この2つの--output-fields=__REALTIME_TIMESTAMP,MESSAGEフィールドを印刷しない理由は次のとおりです。

これ現在のマニュアルページjournalctl、「出力オプション」セクションには次のように指定されています。

--output-fields=
出力に含める必要があるカンマ区切りフィールドのリスト。これは出力にのみ影響します。 通常、スキーマにはすべてのフィールドが表示されます。(verbose、export、json、json-pretty、json-sse、json-seq)、そして猫にも。 ~のため 以前のもの「__CURSOR」、「__REALTIME_TIMESTAMP」、
「__MONOTONIC_TIMESTAMP」、「_BOOT_ID」フィールドは常に印刷されます。

--output-fieldsバージョン 236 に追加されましたが、次の使用時にフィールド フィルタリングをサポートします。-o cat 後でバージョン 246 に追加:

Journalctlの「-o cat」出力モードは、無条件のMESSAGE =の代わりに--output-fields =で指定されたログフィールドを表示します。これは、修正なしで非常に具体的なフィールドセットを検索するのに役立ちます。

以上を踏まえ、次の 4 つのフィールドは、以下を使用しない限り常に印刷されます。 -o cat。何人かの人々は考えるでしょう

journalctl -o cat --output-fields=__REALTIME_TIMESTAMP,MESSAGE

うまくいきますが、印刷してみてください。

Failed to get data: Invalid argument

なぜそんなことですか?
ログフィールドはマニュアルページに記載されています。systemd.journal-fields。メッセージには_SOURCE_REALTIME_TIMESTAMP__REALTIME_TIMESTAMPおよび3つのタイムスタンプフィールドがあります__MONOTONIC_TIMESTAMP(最後の2つは2つの下線で始まります)。これらはすべてマイクロ秒単位で、10進数の文字列形式なので、要件(HH:MM:SS形式)と一致するものはありません。さらに、同じマニュアルページによると、最後の2つのタイムスタンプは特別なアドレス指定フィールドです(アイテムフィルタリングのための一致として使用できません)。

ジャーナルエクスポート形式やジャーナルJSON形式などの外部形式にシリアル化している間日記帳の住所 二重下線接頭辞付きのフィールドに直列化されます。気づく これはログに保存されたときに正しいフィールドではありませんが、 アイテムのアドレス指定のためのメタデータ。次の呼び出しsd_journal_send(3)で構造化ログエントリの一部として記録することはできません。彼らはおそらく また、一致として使用することはできません。 sd_journal_add_match(3)

最後の文が指摘するsd_journal_add_match(3)マニュアルページには次のように記載されています。

sd_journal_add_match()ログファイルエントリをフィルタリングするために一致を追加します。この呼び出しに適用された一致は、sd_journal_next(3)などの呼び出しを介してログファイルで繰り返し読み取れる項目をフィルタリングしますsd_journal_get_data(3)。パラメーター・データは「FIELD=value」形式でなければなりません。大地部分は、0〜9、AZ、および下線のみを含む短い大文字の文字列です。それ 2つの下線で始めることはできませんまたは空の文字列です。

したがって、エラー: __REALTIME_TIMESTAMPNot a valid field name sd_journal_get_data(3).
要約すると:--output-fieldswithを使用すると、許可されている唯一のタイムスタンプがあっても、出力は望むものから離れています。-o cat_SOURCE_REALTIME_TIMESTAMP

journalctl -o cat --output-fields=_SOURCE_REALTIME_TIMESTAMP,MESSAGE

印刷

1699815974366491
Supervising 9 threads of 6 processes of 1 users.
1699815968034836
[system] Successfully activated service 'org.kde.powerdevil.backlighthelper'

答え3

編集する:よりこの回答代わりに。以下の答えは子孫のためだけのものです。


これは2018年に実装されたようです。今回の広報。 236バージョン以降では、--output-fields=の説明に従って使用してください--help。バージョンを確認してくださいsystemctl --version。私のCentOS 7は現在(2019)バージョン219を実行しているため、ほとんどの環境に慣れるのに時間がかかることがあります。

編集する:参考に、EL8(2021年4月12日現在)はsystemd 239で実行されるため利用可能です。

答え4

journalctl--output私はjust、andを使うことがあなたが望むものを正確にするとは信じていません--output-fields

--output=jsonオプションを使用しjournalctlてからjq

jqLinux jsonプロセッサです。あなたはそれを使用することができますsudo apt install jq

オプションで使用可能なフィールドは--output-fields文書化されていません。次の方法で利用可能なすべてのフィールドをインポートできます。

journalctl -n1 --output=json | jq 'keys'

タイムスタンプとメッセージのみを取得できます。

journalctl --output=json | jq '.__REALTIME_TIMESTAMP, .MESSAGE'

ここでは、必要な方法でさらにフォーマット/処理できます。のjqマニュアルを確認することをお勧めしますman jq

たとえば、人間が読めるタイムスタンプを取得するには、次のようにします。

journalctl --output=json | jq '(.__REALTIME_TIMESTAMP | tonumber/1000000 | strflocaltime("%Y-%m-%d %H:%M:%S")), .MESSAGE'

また、jsonの形式を削除し、すべてを1行(Journalctlなど)に入れるには...

journalctl --output=json | jq -r '[(.__REALTIME_TIMESTAMP | tonumber/1000000 | strflocaltime("%Y-%m-%d %H:%M:%S")), .MESSAGE] | @tsv'

関連情報