如何使用log4netlogging跟踪消息?

我正在使用log4net将写入日志消息logging到滚动日志文件。

现在我也将所有跟踪消息从System.Diagnostics.Traceredirect到该日志文件。 我如何configuration? 我试图在log4net文档中find任何有关这方面的信息,但没有成功。 有没有可能?

我想这样做的原因是因为我对第三方库的跟踪消息感兴趣。

 <log4net> <appender name="R1" type="log4net.Appender.RollingFileAppender"> <file value="C:\Logs\MyService.log" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <maxSizeRollBackups value="10" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> </log4net> 

根据Rune的build议,我实现了一个输出到log4net的基本TraceListener:

 public class Log4netTraceListener : System.Diagnostics.TraceListener { private readonly log4net.ILog _log; public Log4netTraceListener() { _log = log4net.LogManager.GetLogger("System.Diagnostics.Redirection"); } public Log4netTraceListener(log4net.ILog log) { _log = log; } public override void Write(string message) { if (_log != null) { _log.Debug(message); } } public override void WriteLine(string message) { if (_log != null) { _log.Debug(message); } } } 

我不知道log4net是否支持这个,但是你可以实现你自己的跟踪监听器。

TraceListener没有太多需要实现的方法,你只需将值转发到log4net,这样做很容易。

要添加一个自定义的跟踪侦听器,你可以修改你的app.config / web.config,或者使用Trace.Listeners.Add(new Log4NetTraceListener());将其添加到代码中Trace.Listeners.Add(new Log4NetTraceListener());

根据上面的答案,这里有一个实现(这个链接是片状的,但我find了源代码):

https://code.google.com/archive/p/cavity/

为了粗略地处理从LogLog类发出的内部log4net trace的问题(在之前的回答中的描述中),我通过检查堆栈帧(这个实现已经做到了)来检查这个类是作为跟踪源的类,忽略这些跟踪消息:

  public override void WriteLine(object o, string category) { // hack to prevent log4nets own diagnostic trace getting fed back var method = GetTracingStackFrame(new StackTrace()).GetMethod(); var declaringType = method.DeclaringType; if (declaringType == typeof(LogLog)) { return; } /* rest of method writes to log4net */ } 

使用TraceAppender仍然会产生上述注释中描述的问题。