代码之家  ›  专栏  ›  技术社区  ›  Dirk Vollmar

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

  •  68
  • Dirk Vollmar  · 技术社区  · 16 年前

    我正在使用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>
    
    4 回复  |  直到 6 年前
        1
  •  67
  •   wilson0x4d    13 年前

    根据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);
            }
        }
    }
    
        2
  •  25
  •   Rune Grimstad    16 年前

    我不知道log4net是否支持这一点,但您可以实现自己的跟踪侦听器来实现这一点。

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

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

        3
  •  1
  •   Neil Dodson    8 年前

    根据上面的答案,这里有一个实现(这个链接很脆弱,但我确实找到了源代码):

    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仍然会产生上面注释中描述的问题。

        4
  •  0
  •   Billy Jake O'Connor    6 年前

    谢谢,

    我把德克的回答简化了一点。

    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);
    }