ログ処理時のbashバッファリングの問題の防止

ログ処理時のbashバッファリングの問題の防止

私のbashバッファリングの問題は、ここで見つけることができる問題と似ています。パイプラインでバッファリングをオフにする

上記の質問のsocatソリューションは、initrd dracutフックスクリプトからこのコマンドにアクセスできるため、非常に興味深いものです。残念ながら、これを私の特定の問題に適用する方法がわかりません。 Journalctl json出力の「リアルタイム」解析(バッファリング防止)。 Journalctlが出力するように各行(各\ n)を処理します。

logmessage() 関数は、バッファがいっぱいになった場合にのみ呼び出され、新しいジャーナル行が印刷されると呼び出されません。問題がjqより前にあるのか、それとも「<<(」リダイレクトにあるのかわかりません)。

(logmessage()は、ログファイルとPlymouthコンソールにメッセージを書き込む簡単な関数です。)

以下のコードでは、バッファがいっぱいになったときにのみ処理されるため、私には役に立ちません。

{
        SEVERITY=( emerg alert crit err warning notice info debug )
        FACILITY=( kern user mail daemon auth syslog lpr news uucp cron authpriv ftp ntp security console cron local0 local1 local2 local3 local4 local5 local6 local7 )
        while read LOG_FACILITY LOG_SEVERITY LOG_TAG LOG_MESSAGE
        do
                logmessage ${FACILITY[$LOG_FACILITY]}.${SEVERITY[$LOG_SEVERITY]} "$LOG_TAG" "$LOG_MESSAGE"
        done < <( journalctl --follow -o json --no-pager --no-tail | jq -r '"\(.SYSLOG_FACILITY // 3) \(.PRIORITY // 6 ) \(.SYSLOG_IDENTIFIER // "journald") \(.MESSAGE | sub("\\n";" ";"g") // "no message")"' )
}&

このコードは特別なinitramfsの一部です。 socat コマンドを使用できます。リアルタイムでログを解析し、施設、優先順位、タグ、メッセージを他の宛先(ログファイル、Plymouthコンソールプラグインなど)に送信する必要があります。

どんなアドバイスも本当にありがとうございます。 (このコードはsystemimagerソフトウェア(GPL)の一部になります。) https://github.com/finley/SystemImager/wiki

どんなアドバイスも本当にありがとうございます。

ベストアンサー1

<(...)次の代わりにパイプを使用すると、何が得られるのかわかりません。

journalctl ... |
jq -r ... |
while read LOG_FACILITY LOG_SEVERITY LOG_TAG LOG_MESSAGE
do logmessage ...
done

もちろん、両方のバージョンに同じバッファリングの問題があります。

ただし、どちらの場合も、次を使用してコマンドをsocat実行したい場合jqjq -r ...

socat -u EXEC:'jq -r ...',pty,ctty STDIO

しかし、大きな問題があります。パラメータを引用する必要があります。jqこれにより、パラメータがsocat少し混乱し、文字列を正しく渡すことが困難になります。この問題を解決する1つの方法は、コマンドをシェル変数に保存して後で使用することです。

export cmd="$(cat <<\! 
jq -r '"\(.SYSLOG_FACILITY // 3) \(.PRIORITY // 6 ) \(.SYSLOG_IDENTIFIER // "journald") \(.MESSAGE | sub("\\n";" ";"g") // "no message")"'
!
)"

socat -u SYSTEM:'eval $cmd',pty,ctty STDIO

しかし、最終的には、jq1つのオプションを選択すると--unbuffered望ましい効果を得ることができるので、これらのいずれも必要ありません。

おすすめ記事