2013-05-08 12 views
8

私は、CLIまたはデーモンの2つのモードで実行できるアプリケーションを持っています。syslogメッセージをstdoutにリダイレクトする方法はありますか?

ログには、syslog()を使用しています。しかし、CLIモードで実行すると、LOG_DEBUGというマークが付いているものを除き、すべてのログがログに記録される代わりにコンソールに送信されます。

私はsetlogmask()を使用しようとしましたが、コンソールにリダイレクトしていないようです。

これを行うにはどのような方法が最適ですか?

+2

AFAIK、FreeBSDのsyslogでは/etc/syslog.confを使ってリダイレクトすることができます。とにかく、それはあなたが探している方法ではありません。 CLIアプリケーションやデーモンとして実行しているかどうかを検出し、コンソールやsyslogに書き込む必要があるかどうかを検出する関数を書くことをお勧めします。 – maverik

答えて

4

maverikのコメントで示唆されているように、出力をログまたはコンソールに送信するかどうかを決定するラッパーをsyslogに書きました。ここで誰もこれを必要とする場合です。

void mylog (int level, const char *format, ...) 
{ 
    va_list args; 
    va_start (args, format); 

    if (remote) 
    { 
     vsyslog(level, format, args); 
    } 
    else 
    { 
     if (level == LOG_DEBUG) 
      vsyslog(level, format, args); 
     else 
      vprintf(format, args); 
    } 
    va_end(args); 
} 
+4

関数から戻る前に 'va_end(args)'を呼び出す。 – jxh

1

GNU固有の解決策として、私はopenlog(NULL, LOG_PERROR, your_facility)を使用してお勧めします。カスタマイズできません(標準エラー出力で重複しています)。

関連する問題