2012-02-07 12 views
25

私はlog4net DebugAppender(またはTraceAppender)を使用しています。私はこのようなアペンダを設定している:コード内log4net出力のログ出力名を表示するVisual Studio出力ウィンドウを停止するにはどうすればよいですか?

<appender name="DebugAppender" type="log4net.Appender.DebugAppender"> 
    <immediateFlush value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level %message%newline" /> 
    </layout> 
</appender> 

ロガーは、通常のクラスごとの方法で宣言されます。

:アウトプットウィンドウで

private static readonly ILog Log = 
    LogManager.GetLogger(typeof(TradingApiRouteCollectionExtensions)); 

出力は次のようになります

Acme.Common.Configuration.TradingApiRouteCollectionExtensions:DEBUGサービスAcme.Session.SessionServiceのルートプレフィックス 'セッション'の登録 Acme.Common.Configuration.TradingApiRouteCollectionExtenシオン:DEBUGのWeb型Acme.Session.SessionService見つかり方法: Acme.Common.Configuration.TradingApiRouteCollectionExtensions:DEBUGセッション/すべての行は、ロガータイプ名で起動方法

注意してください。私は設定でそれを要求しなかったので、これを抑止したいと思います。私はそれを望んでいません。私はこれを行うための明白な方法を見ることができません。出来ますか?

答えて

15

独自のアペンダーを作成する必要があります。

System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), loggingEvent.LoggerName); 
if (!this.m_immediateFlush) 
    return; 
System.Diagnostics.Debug.Flush(); 

したがって、常に出力ウィンドウにクラス(ロガー)名が表示されます。あなたはlog4netデバッグアペンダから派生し、Appendメソッドを上書きすることができます。

+1

ありがとう!迅速な処理を含む、完全な実装を追加するための答えを編集しました。私はあなたがこれと一緒に提案したようにしてくれました。 –

9

また、%newlineでレイアウト変換パターンを開始することもできます。

<appender name="DebuggerAppender" type="log4net.Appender.DebugAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%newline%file (%line): %level: %message%newline"/> 
     </layout> 
    </appender> 

賛否:私の設定から、それはあなた自身のアペンダ

短所を作成するよりも迅速だ:それはあなたが2行にログオンを示しています。

行頭の%file (%line)がVisual Studioで解釈される形式であることに注意してください。それは、出力ウィンドウでログメッセージをクリックし、それを生成したコードに直接移動することができます。

+1

"%file(%line)"のファイル/行形式を使用する最後の注意点は、デバッグウィンドウ内の行をクリックしてコードにジャンプすることが素晴らしいことです。注意すべき点の1つは、これが行の最初のものである必要があるということです。 – denver

+0

StackTrace機能を使用するため、 '%file'と'%line'は* expensive *です。また、リリースビルドで誤解を招く/紛失する可能性があります。 –

1

TraceAppender source codeを読むと、実際にはロガー名がトレースのデフォルトの「カテゴリ」名として書かれています。したがって、この値をすでに設定している場合、ロガー名は出力に表示されません。

ので、下記の設定で:

: 2017-02-27 22:53:26,335 [6] INFO - Task Ended 

しかし、あなたは、すべての行で始まることがあります:

<appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <category value="" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %level - %message%newline%exception" /> 
    </layout> 
</appender> 

出力は次のようになります ":"、醜いです。

... 
<category value="LOG" /> 
... 

、出力は次のとおりです:だからカテゴリのための私のconfigがある

LOG: 2017-02-27 22:53:26,335 [6] INFO - Task Ended 

注:DebugAppenderカテゴリを上書きする方法はありません。 TraceAppenderだけが動作します。

0

回答に対する私の編集が拒否されましたので、別の有用な情報を別途提供しています。ここでは完全な実装は次のようになります。あなたはImmediateFlushプロパティを使用する必要があるので、

public class MyDebugAppender : log4net.Appender.DebugAppender 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); 
     if (ImmediateFlush) 
     { 
      System.Diagnostics.Debug.Flush(); 
     } 
    } 
} 

m_immediateFlushは、派生クラスではアクセスできません。

また、log.configファイルを使用する場合は、Appenderが新しいアセンブリで提供されるように指定する必要があります。 (this SO answerの礼儀。)v2.0.8のように、あなたがカテゴリ名の出力をオフにすることができますことを

<appender name="AppenderRef" type="MyNamespace.MyDebugAppender, MyAppenderAssembly"> 
関連する問題