C# 如何使用log4net记录跟踪消息?

C# 如何使用log4net记录跟踪消息?,c#,.net,log4net,C#,.net,Log4net,我正在使用log4net将日志消息记录到滚动日志文件中 现在,我还要将System.Diagnostics.trace中的所有跟踪消息重定向到该日志文件。我如何配置它?我试图在log4net文档中找到任何与此相关的内容,但没有成功。有可能吗 我想这样做的原因是因为我对第三方库的跟踪消息感兴趣 我不知道log4net是否支持此功能,但您可以实现自己的跟踪侦听器来实现此功能 TraceListener没有太多需要实现的方法,您所要做的就是将值转发到log4net,这样做应该很容易 要添加自定义跟踪侦

我正在使用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事件并以另一种方式记录这些消息。令人遗憾的是,由于此设置,某些附加器错误将不会被记录。消息来源是你的朋友。