RHEL7用のプログラムセットを更新していますが、その一部はC++、一部Java。 systemdサービスで起動したら、systemdログに書き込もうとしています。たとえば、テストのために端末で直接実行されている場合は、標準出力に書きたいとします。どうすれば最もエレガントにできますか?
ロギングの重大度、ファイル名、行番号、スレッド名など、ロギングの高度な機能を活用したいと思います。したがって、単にstdoutに書くだけでは不十分です。
私が検索した結果、プロセスの親PIDを確認するか、対応するcgroupを確認するように求められました。もっと良い方法がありますか?これは不器用な解決策のように見えるかもしれません。理想的には、呼び出すことができる関数や確認する環境変数があります。
追加情報:
- ~のためC++私が呼ぶ予定のプログラムsd_journal_print(3)。
- ~のためJavaSLF4J+Logback+を使用する予定です。ログバックログ。
(私の代替計画はコマンドラインスイッチを使用することですが、自動検出は確かに良いでしょう。)
答え1
systemd バージョン 231 では、JOURNAL_STREAM
この目的のために環境変数が導入されました。プログラムはその値をチェックし、その値を標準エラーのデバイス番号と inode 番号と比較し、それに応じて動作を変更します。
いついいえログに接続すると(もちろん)いつでもJSON(オブジェクトごとに1行)を使用して標準エラーに書き込むことができ、そこにも構造化ロギングがあります。 RFC 5424には、構造化データの(より制限的な)オプションもあります。
答え2
systemd
この状況は、で説明されているようにすでに適切に処理されています。システムランチャー。
標準出力に書き込みます。 systemdを介して実行すると、systemdはデフォルトでSTDOUTをログにリダイレクトします。
別のオプションは、journal+console
常に両方にログインしたい場合です。
STDOUTへのログ記録もベストプラクティスです。アプリデザインの12の要素。