[英]How to log Trace messages with log4net?
我正在使用log4net将写入日志消息记录到滚动日志文件中。
现在,我还将所有跟踪消息从System.Diagnostics.Trace
重定向到该日志文件。 我该如何配置? 我试图在log4net文档中找到有关此内容的任何内容,但均未成功。 有可能吗?
我要这样做的原因是因为我对第三方库的跟踪消息感兴趣。
<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的建议,我实现了一个基本的TraceListener,输出到log4net:
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());
根据上面的答案,这里有一个实现(此链接很不稳定,但是我确实找到了源代码):
https://code.google.com/archive/p/cavity/
为了粗略地处理从LogLog类发出的内部log4net跟踪的问题(在上一个答案的注释中进行了描述),我通过检查堆栈框架(此实现已对此进行检查)来检查此类是否为跟踪的源,并且忽略那些跟踪消息:
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仍会产生上述注释中描述的问题。
谢谢,
我同意了Dirk的答案。
public class Log4netTraceListener : System.Diagnostics.TraceListener
{
private readonly log4net.ILog _log;
public Log4netTraceListener()
: this(log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType))
{
}
public Log4netTraceListener(log4net.ILog log)
{
_log = log;
}
public override void Write(string message) => _log?.Debug(message);
public override void WriteLine(string message) => _log?.Debug(message);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.