プログラムがシステムログまたは標準出力に書き込む必要があるかどうかを検出します。

プログラムがシステムログまたは標準出力に書き込む必要があるかどうかを検出します。

RHEL7用のプログラムセットを更新していますが、その一部は、一部。 systemdサービスで起動したら、systemdログに書き込もうとしています。たとえば、テストのために端末で直接実行されている場合は、標準出力に書きたいとします。どうすれば最もエレガントにできますか?

ロギングの重大度、ファイル名、行番号、スレッド名など、ロギングの高度な機能を活用したいと思います。したがって、単にstdoutに書くだけでは不十分です。

私が検索した結果、プロセスの親PIDを確認するか、対応するcgroupを確認するように求められました。もっと良い方法がありますか?これは不器用な解決策のように見えるかもしれません。理想的には、呼び出すことができる関数や確認する環境変数があります。

追加情報:

(私の代替計画はコマンドラインスイッチを使用することですが、自動検出は確かに良いでしょう。)

答え1

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

いついいえログに接続すると(もちろん)いつでもJSON(オブジェクトごとに1行)を使用して標準エラーに書き込むことができ、そこにも構造化ロギングがあります。 RFC 5424には、構造化データの(より制限的な)オプションもあります。

答え2

systemdこの状況は、で説明されているようにすでに適切に処理されています。システムランチャー

標準出力に書き込みます。 systemdを介して実行すると、systemdはデフォルトでSTDOUTをログにリダイレクトします。

別のオプションは、journal+console常に両方にログインしたい場合です。

STDOUTへのログ記録もベストプラクティスです。アプリデザインの12の要素

関連情報