ジャーナル以外のファイルを時間フィルタリングして表示するためにJournalctlを使用する方法は?

ジャーナル以外のファイルを時間フィルタリングして表示するためにJournalctlを使用する方法は?

systemd-journaldに送信されていない数十のログファイルを検索しようとしていますが、Journalctlの-S(since)や-U(until)など、時間ごとに結果をフィルタリングしたいと思います。

  • オプション1:行を読み取り、タイムスタンプを解析し、フィルター処理された出力を印刷するプログラムの作成
  • オプション2:Ubuntu dateutilsパッケージの/usr/bin/dateutils.dgrepの使用
  • オプション3:ログファイルをログ形式に変換して使用するjournalctl --root $dir -S xxx -U yyy

私は1番から始めて車輪を再創造していることに気づきました。それから3回見ました。ほとんどは速くて完璧で、多くの「目玉」(特に「有料目玉」)を引き付けたからです。 )") 気をつけて。

もしそうなら、エントリを時間ごとにフィルタリングできるようにsyslogスタイルのログファイルをログファイルに変換するツールはありますか? Systemd-catタイムスタンプの偽造は許可されていないため機能しません。結果ログファイルには、すべてのことがほぼ同時に発生したことが示されます。

どんな提案がありますか?

ありがとうございます!

編集する:

ログファイルは100MBを超え、ほぼ100個に達し、タイムスタンプは単純なsyslogスタイル「MMM DD HH:MM:SS」です。私は「この2時間の間のログエントリを表示します」と言いたいのですが。

オプション#1は「これを行うためのプログラムを書く」ですが、このホイールが何度も再作成されたと確信しています。ここに別の(通常)ホイールを追加するのは愚かな感じです。

オプション#2はファイルを完成させず、30分で放棄しました。本質的に、私は再利用可能で、journalctl答えの良い部分のように見える迅速な一般的な解決策が欲しいです。

私はこれがjournalctlログファイルの単調に増加するタイムスタンプを利用し、バイナリ検索を使用して与えられた時間範囲内でレコードを見つけると思います。dateutils.dgrep()プログラムはdategrepそのような仮定を許可していないため、1月当たりよりも遅くなります。

編集2:

入力ログを解析し、ログエクスポート形式でレコードをエクスポートし、systemd-journal-remoteを使用してログファイルを生成する短いスクリプトを作成するようです。

journalctl -n 10 -o export > journal.txt
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
journalctl --file=test.journal -S "yyyy-mm-dd hh:mm:ss" -U "yyyy-mm-dd hh:mm:ss"
   (log entries for time range shown)
journalctl --verify --file=test.journal

PASS: test.journal 

最初はこの行に封印チェックサムを含めることができると思いましたが__CURSOR、これを削除しても目立つ効果はありません。 Ubuntu 20.04では、順方向セキュリティシールはデフォルトで有効になっていないようですが、Journalctlはログエントリが単調に増加しないかどうかを検出します。

rm -f test.journal
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
journalctl --verify --file=test.journal

3947a0: Entry timestamp out of synchronization                                                                                           
File corruption detected at test.journal:3947a0 (of 8388608 bytes, 44%).                                                                 
FAIL: test.journal (Bad message)

任意のログファイルをジャーナル形式でインポートし、Journalctlを使用してアクセスするのはかなり簡単です。

答え1

オプション1 - 時間別にログファイルをフィルタリングする(ログ変換をスキップ)

systemd-journaldに送信されていない数十のログファイルを検索しようとしていますが、Journalctlの-S(since)や-U(until)など、時間ごとに結果をフィルタリングしたいと思います。

特定の日時範囲のsyslogスタイルのログファイルのみを表示するには、次のようにします。super-speedy-syslog-searcher。これはsuper-speedy-syslog-searchersystemdロギングサービスの機能を使用し、使用をスキップします。

あなたが持っていると仮定ラストインストール済み、走る

$ cargo install super_speedy_syslog_searcher

次に、s4ログファイルを含むディレクトリで実行します。

$ s4 /logs

特定の日付/時刻範囲に制限するには-a-bオプションを渡して日付/時刻別にフィルタリングします。日付/時刻フィルタリングを使用したログファイルの処理例

$ cat /tmp/logs/kernel.log
<6>Jan  1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
<6>Jan  2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888

$ cat /tmp/logs/syslog.1
<29>Jan  1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan  3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received

$ s4 -a "2023-01-02T00:00:00Z" -b "2023-01-03T00:00:00Z" /tmp/logs/
<6>Jan  2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888

オプション2 - ログファイルをログファイルに変換

エントリを時間ごとにフィルタリングできるように、syslogスタイルのログファイルをログファイルに変換するツールはありますか?

概要

システムログを変換する一連のタスクは次のとおりです。

  1. 使用super-speedy-syslog-searcher特別にフォーマットされた日付と時刻を使用してログを再印刷します。
  2. 使用journalctl各syslogメッセージをラインベースのデフォルトロガーメッセージに変換するジャーナルのエクスポート形式
  3. 使用systemd-journal-remoteメッセージのインポート

1.super-speedy-syslog-searcherログファイルの再印刷に使用します。

/tmp/logs/syslog.1syslogスタイルのメッセージを含むログファイルを提供する

<29>Jan  1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan  3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received

super-speedy-syslog-searchers4)を使用すると、-nUTCタイムゾーン()は、ファイル名()と先行日時がUnix epoch()(マイクロ秒)で表される行を再印刷します。-d '%s000000'-u

$ s4 -n -u -d '%s000000' /tmp/logs/syslog.1
syslog.1:1672610305000000:<29>Jan  1 13:58:25 HOST netifd: Network device 'eth0' link is up
syslog.1:1672786836000000:<86>Jan  3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received

2. journalctlsyslog メッセージをジャーナル形式のメッセージに変換するために使用されます。

以下は、次のコマンドを使用して最小設計ログ形式のログメッセージを生成する例ですlogger

$ echo "SYSLOG_IDENTIFIER=logger
MESSAGE=one journal logger message
MESSAGE_ID=$(uuidgen)" | logger --journald -s

$ journalctl -n1 -t logger
Feb 03 00:48:01 HOST logger[445736]: one journal logger message

次にエクスポートしたメッセージです。ジャーナルのエクスポート形式

$ journalctl -n1 --identifier=logger --output=export
__CURSOR=s=4a35367b4dd3403b948f1a5ff2fb3515;i=474833;b=5285cccfe2f9481ca12589f5511b8c57;m=dd9ee>
__REALTIME_TIMESTAMP=1675414081923660
__MONOTONIC_TIMESTAMP=951851827460
_BOOT_ID=5286cccfe2f9481ca1ea8cf5221b8c5e
_UID=0
_GID=0
_MACHINE_ID=333fa82c526bba518cdc8c2262e6d480
_HOSTNAME=HOST
_TRANSPORT=journal
SYSLOG_IDENTIFIER=logger
MESSAGE=one journal logger message
MESSAGE_ID=4ebd2168-30bf-4258-bf0f-54b5811674e1
_PID=445736
_COMM=logger
_SOURCE_REALTIME_TIMESTAMP=1675414081923606

3.systemd-journal-remoteログログメッセージを取得するために使用されます。

人工メッセージを取得するには、同様のデータをログサービスとして再送信を使用してくださいsystemd-journal-remote

ログメッセージの場合、各新しいログエントリには、、、、、MESSAGE_IDパラメータのみMESSAGEが必要です。設定。値をオーバーライドし、Unix時代以降のマイクロ秒単位の日付/時刻スタンプを使用します。 ~のため_TRANSPORT__REALTIME_TIMESTAMP_SOURCE_REALTIME_TIMESTAMP_TRANSPORTsyslog__REALTIME_TIMESTAMP_SOURCE_REALTIME_TIMESTAMP2023年1月1日 15:00:36 PST、値は1672614036000000

$ echo "\
__REALTIME_TIMESTAMP=1672614036000000
_TRANSPORT=syslog
MESSAGE_ID=4ebd2168-30bf-4258-bf0f-54b5811674e1
MESSAGE=one journal logger message
SYSLOG_IDENTIFIER=logger
_SOURCE_REALTIME_TIMESTAMP=1672614036000000
" | /usr/lib/systemd/systemd-journal-remote --output=/tmp/tmp.journal -

$ journalctl --output=short-full --file=/tmp/tmp.journal
Sun 2023-01-01 15:00:36 PST logger: one journal logger message

1.、2.、3.を合わせてください。

これらすべてのコンテンツのログファイルディレクトリ/tmp/logs/tmp/logsj

syslogスタイルのログファイルが与えられた場合:

$ cat /tmp/logs/kernel.log
<6>Jan  1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
<6>Jan  2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888

$ cat /tmp/logs/syslog.1
<29>Jan  1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan  3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received

kernel.log次の方法でファイルを再印刷してくださいs4

$ s4 --color=never -n -u -d '%s000000' /tmp/logs/kernel.log | tail -n1
kernel.log:1672689660000000:<6>Jan  2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888

:前に追加されたフィールドは(デフォルト)で区切られます。

pathの下の各syslogスタイルのログファイルを/tmp/logspathの下の対応するログファイルとして扱います/tmp/logsjSYSLOG_IDENTIFIERファイル拡張子を除くファイル名に設定されます。生成されたログファイルは、ソースファイル名に.journal

#!/usr/bin/env bash

mkdir /tmp/logsj

while read line; do
  echo "line is '${line}'"
  name=$(echo -n "${line}" | cut -f1 -d:)
  ts=$(echo -n "${line}" | cut -f2 -d:)
  mesg=$(echo -n "${line}" | cut -f3- -d:)
  jmesg="\
__REALTIME_TIMESTAMP=${ts}
_TRANSPORT=syslog
MESSAGE_ID=$(uuidgen)
MESSAGE=${mesg}
SYSLOG_TIMESTAMP=${ts}
SYSLOG_IDENTIFIER=${name%%.*}
_SOURCE_REALTIME_TIMESTAMP=${ts}
"
  echo "${jmesg}" | /usr/lib/systemd/systemd-journal-remote "--output=/tmp/logsj/${name}.journal" -
done <<< $(s4 --color=never -n -u -d '%s000000' /tmp/logs/)

新しいログファイルを表示します。

$ ls -l /tmp/logsj/
-rw-r----- 1 root root 8388608 Feb  3 14:36 kernel.log.journal
-rw-r----- 1 root root 8388608 Feb  3 14:36 syslog.1.journal

$ PAGER= journalctl --utc --output=short-full --directory=/tmp/logsj/
Sun 2023-01-01 21:58:25 UTC kernel: <6>Jan  1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
Sun 2023-01-01 21:58:25 UTC syslog: <29>Jan  1 13:58:25 HOST netifd: Network device 'eth0' link is up
Mon 2023-01-02 20:01:00 UTC kernel: <6>Jan  2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
Tue 2023-01-03 23:00:36 UTC syslog: <86>Jan  3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received

journalctl日付/時刻フラグメントで動作します。

$ PAGER= journalctl --utc --output=short-full --until "2023-01-01 23:00:00 UTC" --directory=/tmp
/logsj/
Sun 2023-01-01 21:58:25 UTC kernel: <6>Jan  1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
Sun 2023-01-01 21:58:25 UTC syslog: <29>Jan  1 13:58:25 HOST netifd: Network device 'eth0' link is up

$ PAGER= journalctl --utc --output=short-full --since "2023-01-01 23:00:00 UTC" --directory=/tmp
/logsj/
Mon 2023-01-02 20:01:00 UTC kernel: <6>Jan  2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
Tue 2023-01-03 23:00:36 UTC syslog: <86>Jan  3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received

関連情報