2012-02-07 54 views
25

我正在使用log4net DebugAppender(或TraceAppender)。我已經配置了附加器是這樣的:如何停止顯示log4net輸出的記錄器名稱的Visual Studio輸出窗口?

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

輸出在輸出窗口看起來是這樣的:

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

記錄儀中的代碼通常每個類的方式聲明

Acme.Common.Configuration.TradingApiRouteCollectionExtensions:DEBUG爲服務註冊路由前綴'session'Acme.Session.SessionService Acme.Common.Configuration.TradingApiRouteCollectionExten sions:找到了類型Acme.Session.SessionService DEBUG Web方法: Acme.Common.Configuration.TradingApiRouteCollectionExtensions:調試會話/

注意每一行如何與記錄類型名稱開始。我想壓制這個,因爲我沒有在配置中要求它,我不想要它。我看不到任何明顯的方式來做到這一點。可能嗎?

回答

15

您需要創建自己的appender。您正在使用的是:

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

因此,您總是以輸出窗口中的類(記錄器)名稱結束。您可以從log4net Debug appender派生並覆蓋Append方法。

+1

謝謝!編輯您的答案以添加完整實施,包括立即沖洗處理。我按照你的建議添加了它,並且它有效。 – 2012-02-07 15:54:50

9

或者,您可以使用%newline開始佈局轉換模式。從我的配置:

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

優點:它比創建自己的appender

缺點更快:它表明你登錄2行。

請注意,行首的%file (%line)是由Visual Studio解釋的格式。它允許您在輸出窗口中單擊日誌消息並直接轉到生成它的代碼。

+1

使用「%file(%line)」的文件/行格式的最後一個注意事項是允許您在調試窗口中單擊該行並跳轉到代碼真棒。有一件事要注意,這需要成爲第一件事。 – denver 2013-11-21 15:45:32

+0

請注意'%file'和'%line' *因爲使用StackTrace功能而非常昂貴。在發佈版本中也可能會引起誤解/缺失。 – 2016-02-04 13:23:26

1

如果您閱讀TraceAppender source code,您會發現記錄器名稱實際上是作爲跟蹤的默認「類別」名稱寫入的。因此,如果您已經設置了該值,記錄器名稱將不會顯示在輸出中。因此,與下面的配置

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

輸出將是:

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

但你可能會發現,每一行開頭 「:」 這是醜陋的。所以,我的類別配置是:

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

,輸出是:

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

注:DebugAppender不提供覆蓋類的方式。只有TraceAppender有效。

0

我對答案的編輯被拒絕,因此單獨提供了其他有用的信息。下面是一個完整的實現將是什麼樣子:

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是在派生類中不可訪問,所以你需要使用ImmediateFlush屬性。

此外,請注意,如果使用log.config文件,則需要指定您的Appender是在新程序集中提供的。 (中this SO answer禮貌。)

<appender name="AppenderRef" type="MyNamespace.MyDebugAppender, MyAppenderAssembly"> 
相關問題