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-searcher
systemdロギングサービスの機能を使用し、使用をスキップします。
あなたが持っていると仮定ラストインストール済み、走る
$ 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スタイルのログファイルをログファイルに変換するツールはありますか?
概要
システムログを変換する一連のタスクは次のとおりです。
- 使用
super-speedy-syslog-searcher
特別にフォーマットされた日付と時刻を使用してログを再印刷します。 - 使用
journalctl
各syslogメッセージをラインベースのデフォルトロガーメッセージに変換するジャーナルのエクスポート形式 - 使用
systemd-journal-remote
メッセージのインポート
1.super-speedy-syslog-searcher
ログファイルの再印刷に使用します。
/tmp/logs/syslog.1
syslogスタイルのメッセージを含むログファイルを提供する
<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-searcher
(s4
)を使用すると、-n
UTCタイムゾーン()は、ファイル名()と先行日時が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. journalctl
syslog メッセージをジャーナル形式のメッセージに変換するために使用されます。
以下は、次のコマンドを使用して最小設計ログ形式のログメッセージを生成する例です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
_TRANSPORT
syslog
__REALTIME_TIMESTAMP
_SOURCE_REALTIME_TIMESTAMP
2023年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/logs
pathの下の対応するログファイルとして扱います/tmp/logsj
。SYSLOG_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