私はRHEL7用のプログラムスイートを更新しています。C++ の、 いくつかのジャワ. systemd サービスとして起動された場合は、systemd ジャーナルに書き込むようにしたいと思います。テストなどのためにターミナルで直接実行される場合は、代わりに stdout に書き込むようにしたいと思います。これを最もエレガントに行うにはどうすればよいでしょうか?
ログの重大度、ファイル名、行番号、スレッド名などのジャーナルの高度な機能を活用したいので、単に stdout に書き込むだけでは不十分です。
検索した結果、プロセスの親 PID を確認するか、その cgroup を確認するようにというアドバイスが得られました。もっと良い方法はありますか? これらは場違いな解決策のように思えます。理想的には、呼び出せる関数、または確認できる環境変数があるはずです。
追加情報:
- のためにC++ の私が呼び出す予定のプログラムsd_journal_print(3)。
- のためにジャワ使用予定のプログラム SLF4J + Logback +ログバックジャーナル。
(私の代替案はコマンドラインスイッチを使用することですが、自動検出できれば確かに便利です。)
答え1
systemd バージョン 231 では、JOURNAL_STREAM
まさにこの目的のために環境変数が導入されました。プログラムはその値をチェックし、その値を標準エラーのデバイスおよび i-node 番号と比較し、それに応じて動作を変更します。
いつないジャーナルに接続すると、標準エラーに書き込まれた JSON のようなものを (もちろん) いつでも使用して (オブジェクトごとに 1 行として)、そこにも構造化されたログ レコードを作成できます。RFC 5424 にも (より限定された) 構造化データ オプションがあります。
答え2
systemd
すでにこのケースはうまく処理されており、システムd.exec。
STDOUT にログを記録します。systemd 経由で実行すると、systemd はデフォルトで STDOUT をジャーナルにリダイレクトします。
もう 1 つのオプションは、journal+console
常に両方にログを記録する場合です。
STDOUTにログを記録することもベストプラクティスです。12 ファクター アプリ デザイン。