75

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

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

我想这样做的原因是因为我对 3rd 方库的 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>
4

4 回答 4

74

根据 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);
        }
    }
}
于 2009-02-05T11:39:44.360 回答
26

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

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

要添加自定义跟踪侦听器,您可以修改 app.config/web.config 或者将其添加到代码中Trace.Listeners.Add(new Log4NetTraceListener());

于 2009-02-05T10:49:54.650 回答
1

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

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

于 2016-06-08T10:07:44.730 回答
1

谢谢,

我选择了德克的答案,稍微精简了一点。

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);
}
于 2019-02-03T10:40:22.083 回答