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

Dir*_*mar 73 .net c# log4net

我正在使用log4net将写入日志消息记录到滚动日志文件中.

现在我还将所有跟踪消息重定向System.Diagnostics.Trace到该日志文件.我该如何配置?我试图在log4net文档中找到有关它的任何内容,但没有成功.有可能吗?

我想这样做的原因是因为我对第三方库的Trace消息感兴趣.

<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>
Run Code Online (Sandbox Code Playgroud)

Dir*_*mar 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +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认同)

Run*_*tad 26

我不知道log4net是否支持这个,但你可以实现自己的跟踪监听器来做到这一点.

TraceListener没有太多需要实现的方法,您所要做的就是将值转发到log4net,这应该很容易实现.

要添加自定义跟踪侦听器,您可以修改app.config/web.config,也可以使用代码添加它 Trace.Listeners.Add(new Log4NetTraceListener());