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>
ルーンの提案によると、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);
}
}
}
Log4netがこれをサポートしているかどうかはわかりませんが、これを行う独自のトレースリスナーを実装できます。
TraceListenerには、実装する必要のあるメソッドがあまり多くないので、log4netに値を転送するだけで、簡単に実行できます。
カスタムトレースリスナーを追加するには、app.config/web.configを変更するか、Trace.Listeners.Add(new Log4NetTraceListener());
を使用してコードに追加します。
ありがとう、
私はダークの答えを少しスリムにして行きました。
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);
}
上記の回答に従って、ここに実装があります(このリンクは不安定ですが、ソースコードは見つかりました)。
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を使用すると、上記のコメントで説明した問題が引き続き発生します。