我正在使用log4net将写入日志消息记录到滚动日志文件中.
现在我还将所有跟踪消息重定向System.Diagnostics.Trace
到该日志文件.我该如何配置?我试图在log4net文档中找到有关它的任何内容,但没有成功.有可能吗?
我想这样做的原因是因为我对第三方库的Trace消息感兴趣.
Dirk Vollmar.. 71
根据Rune的建议,我实现了一个输出到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); } } }
+1为上面的答案.如果log4net也设置为写入TraceAppender,我会小心.我实际上没有测试过这个,但是你最终可能会遇到Trace写入log4net并且log4net正在写入Trace导致无限循环的情况.例如,如上所示,您可以通过在记录器'System.Diagnostics.Redirection'的appender中不包含TraceAppender来缓解这种情况. (12认同)
看一下log4net.Util.LogLog类的源代码.默认情况下,这会记录到Trace,并且@Jimit大部分都是正确的 - 如果发生appender错误,你最终会陷入僵局.在TraceListener的实现中,我确保在实现的构造函数中设置log4net.Util.LogLog.EmitInternalMessages = false,并且可能处理LogLog.LogReceived事件并以另一种方式记录这些消息.令人遗憾的是,由于此设置,将不会记录某些appender错误.来源是你的朋友. (4认同)
在log4net中是否有可以监听跟踪事件的内置监听器? (3认同)
Rune Grimsta.. 26
我不知道log4net是否支持这个,但你可以实现自己的跟踪监听器来做到这一点.
TraceListener没有太多需要实现的方法,您所要做的就是将值转发到log4net,这应该很容易实现.
要添加自定义跟踪侦听器,您可以修改app.config/web.config,也可以使用代码添加它 Trace.Listeners.Add(new Log4NetTraceListener());
根据Rune的建议,我实现了一个输出到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());