2017-07-10 15 views
0

私は現在、デーモンとして動作するプログラムのログマクロを定義しようとしています。フォーマットされたperrorトレースを持つログマクロ

デーモンなので、stdoutとstderrの両方を特定のファイルにリダイレクトします。この手順は問題ありません。同じファイルに書き込むログ用のマクロが2つあります。

define LOG(fmt, args...)  fprintf(stdout, fmt, ## args); \ 
           fflush(stdout) 

#define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args); 

私のポイントは、私は、 "perrorは様" トレースがしたいです:

<Message with arguments> : <errno associated message> 

だから私は少しを検索し、私はLOG_ERRを変更した場合:

#define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args); \ 
           perror("") 

それ動作していますが、エラーが発生したメッセージは\ nカーネルの後に送信されます(stderrがバッファされているためだと思います)

<Message with arguments> 
<errno associated message> 

最後のパラメータとしてstrerror関数を使用することもできますが、それが可能かどうかはわかりません。 それは次のようになります。

#define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args, strerror(errno)); 

しかし、errnoに意義が挿入されていないとラインcaracterのも、終わりが書き込まれていないとして、この解決策も失敗します。

誰かが関数を使用せずにどのように達成できるか知っていますか?

+0

だけコメント:一般的には、デーモンプロセスがstdoutとstderrを使用しないでください。たぶんsyslog()やvsyslog()が良い選択でしょうか? –

+1

なぜ機能が間違っていますか?とにかくprintfを呼び出します。関数をインラインにすると、同じパフォーマンスが得られます。 –

+0

'fmt'引数は常に文字列リテラルですか?次に、文字列連結を '#'で使うか、スペースだけで使うことができます。例えば。 '' fmt '':%s \ n "' –

答えて

0

あなたのアドバイスのおかげで、私は何をしたいと思っていました。

Bjornのアドバイスに従って、stderrとstdoutの代わりにsyslogを使用するように変更しました。 Bjornは、デーモンがstderrとstdoutを使用してはならない理由について、より多くの情報を持っていますか?私はその理由を知りたいと思っています。

誰かにとって役に立ちそうな場合に備えて私の解決策を示します。

#define SYSLOG(fmt, args...)  syslog(LOG_NOTICE, fmt, ## args); 
#define SYSLOG_ERR(fmt, args...) syslog(LOG_ERR, fmt " : %s", ## args , strerror(errno)); 

再び以前の

openlog("<program_name>", LOG_PID, LOG_DAEMON); 

感謝を忘れないでください。)

関連する問題