私は私ですjournalctl
。conky
journalctl
journalctl -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
唯一のオプションは他のツールを使用してそのデータを抽出/フォーマットすることです。ユーザーと同様に、これらのモードのいずれかを使用するか、出力モードを使用してタイムスタンプとメッセージのみを抽出
できます(タイムスタンプのみを時間に変換)。journalctl
json
export
ディーン・レジン ここに表示通過するjq
。
また、使用可能なバインディングの1つを使用しsystemd
、ユーザーが提案したようにそのデータをインポートするためのツールを直接作成することもできます。マクシココメント(例:python systemd.journal
)
最後にメッセージをリアルタイムで表示するには、モードjournalctl
で使用し、次のように行がfollow
印刷されるたびにタイムスタンプを前に追加できます。ts
moreutils
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_TIMESTAMP
Not a valid field name sd_journal_get_data(3)
.
要約すると:--output-fields
withを使用すると、許可されている唯一のタイムスタンプがあっても、出力は望むものから離れています。-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
答え4
journalctl
--output
私はjust、andを使うことがあなたが望むものを正確にするとは信じていません--output-fields
。
--output=json
オプションを使用しjournalctl
てからjq
。
jq
Linux 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'