C# 如何使用log4net记录跟踪消息?
我正在使用log4net将日志消息记录到滚动日志文件中 现在,我还要将C# 如何使用log4net记录跟踪消息?,c#,.net,log4net,C#,.net,Log4net,我正在使用log4net将日志消息记录到滚动日志文件中 现在,我还要将System.Diagnostics.trace中的所有跟踪消息重定向到该日志文件。我如何配置它?我试图在log4net文档中找到任何与此相关的内容,但没有成功。有可能吗 我想这样做的原因是因为我对第三方库的跟踪消息感兴趣 我不知道log4net是否支持此功能,但您可以实现自己的跟踪侦听器来实现此功能 TraceListener没有太多需要实现的方法,您所要做的就是将值转发到log4net,这样做应该很容易 要添加自定义跟踪侦
System.Diagnostics.trace
中的所有跟踪消息重定向到该日志文件。我如何配置它?我试图在log4net文档中找到任何与此相关的内容,但没有成功。有可能吗
我想这样做的原因是因为我对第三方库的跟踪消息感兴趣
我不知道log4net是否支持此功能,但您可以实现自己的跟踪侦听器来实现此功能 TraceListener没有太多需要实现的方法,您所要做的就是将值转发到log4net,这样做应该很容易
要添加自定义跟踪侦听器,您可以修改app.config/web.config,或者使用
trace.Listeners.add(new Log4NetTraceListener())将其添加到代码中代码>根据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);
}
}
}
根据上面的答案,这里有一个实现(这个链接很脆弱,但我确实找到了源代码):
为了粗略地处理从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仍然会产生上述评论中描述的问题 谢谢
我同意德克的答案,但答案稍微精简了一点
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);
}
+以上的答案是1。如果log4net也被设置为写入TraceAppender,我会小心的。我还没有实际测试过这一点,但您可能会遇到这样的情况:Trace正在向log4net写入,而log4net正在向Trace写入,从而导致一个无限循环。例如,根据上面的示例,您可以通过在记录器“System.Diagnostics.Redirection”的附件中不包含TraceAppender来缓解这种情况。因为这是一个跟踪侦听器,所以您应该在写入方法中实现try/catch块,以确保写入尝试不会使主机失败。我提交的代码编辑更正了对象构造,使代码更具可读性,不太可能失败。@JYL这里是。然而,看起来有些东西可能在搬家过程中丢失了。那篇文章中的XML代码现在不正确,到Log4NetraceListener的链接不起作用。希望作者能够恢复代码。log4net中是否有内置的侦听器可以侦听跟踪事件?请查看log4net.Util.LogLog类的源代码。默认情况下,这会记录跟踪,@Jimit基本上是正确的-如果发生appender错误,您将陷入死锁。在TraceListener的实现中,我会确保在实现的构造函数中设置log4net.Util.LogLog.EmitInternalMessages=false,并可能处理LogLog.LogReceived事件并以另一种方式记录这些消息。令人遗憾的是,由于此设置,某些附加器错误将不会被记录。消息来源是你的朋友。