如何使用log4netlogging跟踪消息?
我正在使用log4net将写入日志消息logging到滚动日志文件。
现在我也将所有跟踪消息从System.Diagnostics.Trace
redirect到该日志文件。 我如何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仍然会产生上述注释中描述的问题。