これまで、私はprintfを使用してきましたが、出力はstdioに送信されます。 stdioからそれを削除してsyslogに入れようとしています。
私は大きなコードベースを持っているので、すべてのprintfを置き換えるのは良い考えではありません。
いくつかのアイデアはfreopen()またはdup()/ dup2()を使用することですが、私はこれがまったく好きではありません。
これをどのように保管できるかを知っている人はいますか?
答え1
1つのアプローチは、ログメッセージをフォーマットし、それをsyslogに送信するのが難しい作業を実行するstdout
パイプに1を変更することです。logger
char cmd[64];
sprintf(cmd, "logger -t your-program -p daemon.info --id=%d", getpid());
stdout = popen(cmd, "w");
setlinebuf(stdout);
(エラー処理は練習として残しました)
または、プログラムをまったく修正しないで、次のように実行します。
sh -c 'echo "$$"; exec stdbuf -oL your-program' |
(
IFS= read -r pid &&
exec logger -p daemon.info -t your-program --id="$pid"
)
your-program
この場合、logger
stdio APIを介して実行されない場合(たとえば、directを使用しwrite(1, data, length)
てfd 1が別のものにリダイレクトされないと仮定する場合)を含む、byとその子孫のすべての出力がにリダイレクトされます。
-oL
setlinebuf(stdout)
このコードを実行ファイルに挿入して上記と同じ効果を得ます。プログラムされている場合(または呼び出される他のプログラムも影響を受けます)、そうでなければ呼び出しはsetvbuf()
動的に接続されていないか、setuid / setgidです。
¹実際のstdout / fdではなくstdioFILE*
オブジェクト1なので、プログラムが子プロセスで別のコマンドを実行しても影響はありません。