75

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>
4

4 に答える 4

74

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

ありがとう、

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