2016-12-12 73 views
0

在我們的系統中,我們同時使用Trace.Write()(舊方法)和log4net記錄。log4net - TraceListener&TraceAppender - 混合兩種記錄方法

我想統一這些方法。我添加了名爲Log4NetTraceListener的自定義偵聽器,它處理來自Trace的消息並將它們放入日誌文件中。簡化代碼:

public class Log4NetTraceListener : System.Diagnostics.TraceListener 
{ 
public override void Write(string message) 
{ 
      _log.Debug(message); 
} 

它工作正常,但我想也是這樣做的記錄,甚至定期log4net的方法Visual Studio中的輸出窗口。

我的第一個想法是添加TraceAppender到log4net配置。它可以很好地工作,但與聽衆的交流會導致無限循環。

有沒有「乾淨」的方式來處理這樣的問題?也許一些過濾聽衆或appender?

+0

難道你不能只是添加一個DebugAppender到log4net配置? – thudbutt

回答

0

假設所有Trace.Write()呼叫經過Log4NetTraceListener類和你的log4net的日誌記錄的其餘部分沒有(即它只是正常.Debug().Error()電話),那麼你可以配置你的日誌層次結構,以便使Trace.Write()呼叫不會結束調用TraceAppender。例如

<log4net> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] - %message%newline"/> 
    </layout> 
    </appender> 
    <root> 
    <level value="ALL" /> 
    <appender-ref ref="TraceAppender" /> 
    </root> 
    <logger name="Log4NetTraceListener"> 
    <level value="OFF" /> 
    </logger> 
</log4net> 

這使得在Log4NetTraceListener_log字段指定Log4NetTraceListener的記錄器名稱的假設。

或者,如果您使用DebugAppender而不是TraceAppender,它將在調試時將輸出到Visual Studio輸出窗口。