2016-09-26 20 views
0

私はWinFormsアプリケーションへのログインにlog4net APIを使用しています。私は複数のアペンダーを持っている:RollingFileAppenderとTextBoxAppender(カスタムアペンダー)。log4netログメッセージはいくつかのアペンダーにのみ

いくつかのエラーメッセージは、ログファイル(RollingFileAppender)にのみ記録し、テキストボックス(TextBoxAppender)には記録しません。どうすれば達成できますか?メッセージは同じレベル、すなわちすべてのERRORメッセージであることに留意されたい。

ありがとうございました。

EDIT 1:

具体的には、私は唯一のログファイルにシンプルなUIで1行のエラーメッセージだけでなく、ログファイルが、スタックトレースを表示したいです。ここで

あなたが基づいてフィルタリングすることができます

+1

あなたは* * fは、適切なアプリケーションを介して(ちょうど1ロガーでこれを行うことができますが、 ilters)これはlog4netのグレインに逆らっています。通常は、設定ごとに別々のロガーを使い、必要に応じてロガーにアペンダーを追加します( 'FileLogger'、' UILogger'、 'UniversalLogger'など)。ロガーはアペンダーを共有できます。 –

+0

別々のロガーを使用する場合でも、同じレベルのメッセージをフィルタリングするにはどうすればいいですか?たとえば、ログレベルERRORのメッセージがUILoggerに表示され、いくつかのメッセージが同じログレベルERRORで表示されません。基本的には、logger1.Error()やlogger2.Error()のように、必要に応じて両方のロガーを呼び出す必要があるすべての場所であることをお勧めします。 – AllSolutions

+0

複数のロガーインスタンスを使用して、ログメッセージは1つの宛先にしか送信されませんが、大部分のケースでは、メッセージを両方のロガーに送信する必要があります。 – AllSolutions

答えて

2

実際、メッセージは両方のアペンダーに送られますが、どちらか一方しかスタックトレースを記録しません。まず、例外として例外を含むメッセージを記録、Exception.ToString()を使用しないでください:

logger.Error($"Something went wrong frobbing the widget: {ex.Message}", ex); 

次に、あなたのロガーは、我々は例外の世話をすることがありますlog4netのを伝えることで、スタックトレースを省略するそのうちのいくつかは、複数のアペンダを、使用することができます(実際には彼らと何もしないことで):詳細と

<appender name="TextBoxAppender" type="MyAppenders.TextBoxAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <ignoresException value="false" /> 
     <conversionPattern value="%m%n" /> 
    </layout> 
</appender> 

その他:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{ISO8601} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 
+0

TextBoxAppenderの場合、ignoresExceptionをtrueに設定し、コードをlogger.Error( "Stack Trace:"、ex);に変更しました。それでもテキストボックスにスタックトレースが表示されます。私は何を取りこぼしたか?私の変換パターンは次のとおりです。 AllSolutions

+0

おっと、私は混乱しています。 'ignoresException'は' layout'が例外を処理していることを示すために 'false'でなければなりません。 –

+0

Ok Yes :)これをfalseに設定すると、UIのスタックトレースを抑制できます。しかし、私のコードは:logger.Error( "Stack Trace:"、ex); UIは「スタックトレース」という単語を表示します。 UIに何も表示させたくない場合は、最初のパラメータで何を渡す必要がありますか? – AllSolutions

1

異なるアペンダに出力の異なるメッセージを解決するには、ForwardingAppenderhttps://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html logging.apache上のドキュメントは現在ダウンしているようだが、とにかく、ここのリンクです)でなければなりません(ほとんどの例)でもログメッセージに基づいています(http://www.codeproject.com/Articles/140911/log-net-Tutorial、段落 "StringMatchFilter")。

少なくとも、これは1つの特定のAppenderにこのメッセージを1つだけ持ち込むのに役立ちます。 スタックトレースを省略する方法を確認するには、Jeroen Mostertsの回答を参照してください。

関連する問題