簡體   English   中英

如何使用log4net記錄跟蹤消息?

[英]How to log Trace messages with log4net?

我正在使用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>

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

我不知道log4net是否支持此功能,但是您可以實現自己的跟蹤偵聽器來執行此操作。

TraceListener沒有太多需要實現的方法,您所要做的就是將值轉發到log4net,因此這應該很容易做到。

要添加自定義跟蹤偵聽器,您可以修改app.config / web.config或使用Trace.Listeners.Add(new Log4NetTraceListener());將其添加到代碼中Trace.Listeners.Add(new Log4NetTraceListener());

根據上面的答案,這里有一個實現(此鏈接很不穩定,但是我確實找到了源代碼):

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仍會產生上述注釋中描述的問題。

謝謝,

我同意了Dirk的答案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM