ロギングをバイパスし、syslogに直接ロギングする機会を提供するsystemdツールを使用するソリューションをしばらく探していました。もちろん、フィルタリングも可能ですが、システムログではなくログのみをフィルタリングできます。
これまで私は正しい選択をすることができませんでした。私のシステムは239-68システムのOL8です。
すでに試しました:
[Service]
...
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my_service
...
これは、ログとsyslogのデュアルロギングを提供します。 2回目の試みがStandardOutput
設定されましたStandardError
。append
この方法で送信されたメッセージはネイティブメッセージであり、自分の管轄区域外の送信者(アプリケーション)が設定する必要がある識別子やタイムスタンプがないため、上記の方法を使用したくありません。
別のスクリプトでロガーを使用してこれを実行できることを知っていますが、これは非公式なので、実際には最後の手段ですExecStart
。2>&1
私も次の2つのトピックを見ました。
https://github.com/systemd/systemd/issues/6432
https://github.com/systemd/systemd/pull/24058
しかし、それらのどれも上記の問題を具体的に扱っていません。
この問題を解決する方法についての他のアイデアを教えてください。
ベストアンサー1
1つの可能性は、プログラムの標準出力をUnixドメインソケットに接続することです。フィルタリングを実行し、最後にファイルに書き込む前にこのソケットを読み込み、タイムスタンプを追加するようにrsyslogdを設定します。たとえば、次の行を次に追加します/etc/rsyslog.conf
。
module(load="imptcp")
input(type="imptcp" path="/tmp/mysocket1" name="my1")
template(name="outfmt" type="string" string="%timegenerated:::date-rfc3339% %inputname% %rawmsg%\n")
if $inputname=="my1" then {
action(type="omfile" file="myoutput" template="outfmt")
}
rsyslogdが再起動するとソケットが作成されます/tmp/mysocket1
。システムサービスファイルに使用
StandardOutput=file:/tmp/mysocket1
デフォルトではStandardError
同じソケットが継承されますStandardOutput
。
プログラムで書かれたすべての行は、rsyslogdから読み取られ、受信タイムスタンプ、入力に提供された名前「my1」、およびrawmsgを追加するなど、処理されます。 (rsyslogドキュメントによると、systemdは実際にメッセージのタイムスタンプを無視し、独自の内部時間を使用するため、これはまれではありません。)
複数のプログラムを区別する必要がある場合は、各プログラムには独自の名前付きソケットが必要です。テストするよりも、inputname
ルールセットに設定を含めることをお勧めします。もちろん、独自の設定ファイルを使用して別々の専用rsyslogdデーモンを作成して実行することもできます。