プログラムが systemd ジャーナルまたは stdout にログを記録する必要があるかどうかを検出する

プログラムが systemd ジャーナルまたは stdout にログを記録する必要があるかどうかを検出する

私はRHEL7用のプログラムスイートを更新しています。、 いくつかの. systemd サービスとして起動された場合は、systemd ジャーナルに書き込むようにしたいと思います。テストなどのためにターミナルで直接実行される場合は、代わりに stdout に書き込むようにしたいと思います。これを最もエレガントに行うにはどうすればよいでしょうか?

ログの重大度、ファイル名、行番号、スレッド名などのジャーナルの高度な機能を活用したいので、単に stdout に書き込むだけでは不十分です。

検索した結果、プロセスの親 PID を確認するか、その cgroup を確認するようにというアドバイスが得られました。もっと良い方法はありますか? これらは場違いな解決策のように思えます。理想的には、呼び出せる関数、または確認できる環境変数があるはずです。

追加情報:

(私の代替案はコマンドラインスイッチを使用することですが、自動検出できれば確かに便利です。)

答え1

systemd バージョン 231 では、JOURNAL_STREAMまさにこの目的のために環境変数が導入されました。プログラムはその値をチェックし、その値を標準エラーのデバイスおよび i-node 番号と比較し、それに応じて動作を変更します。

いつないジャーナルに接続すると、標準エラーに書き込まれた JSON のようなものを (もちろん) いつでも使用して (オブジェクトごとに 1 行として)、そこにも構造化されたログ レコードを作成できます。RFC 5424 にも (より限定された) 構造化データ オプションがあります。

答え2

systemdすでにこのケースはうまく処理されており、システムd.exec

STDOUT にログを記録します。systemd 経由で実行すると、systemd はデフォルトで STDOUT をジャーナルにリダイレクトします。

もう 1 つのオプションは、journal+console常に両方にログを記録する場合です。

STDOUTにログを記録することもベストプラクティスです。12 ファクター アプリ デザイン

関連情報