INDEX
Log4net トレースリスナー
.NET 標準で用意されている、トレース出力またはデバッグ出力のメッセージを、log4net のロガーを通してデバック出力するトレースリスナー。
トレース出力およびデバッグ出力を監視するリスナーの抽象クラス System.Diagnostics.TraceListener を継承し、 Write および WriteLine メソッドを実装して作成する。
作成したリスナーは、アプリケーション内で Listeners コレクション に追加するか、構成ファイルの system.diagnostics 要素で指定する。
サンプルコード
StringBuilder で、出力メッセージをためておき、WriteLine もしくは Flush で、デバックログに出力する。namespace は適に変更のこと。
1 |
namespace ScrapCode.DotNet.Diagnostics
{
/// <summary>トレース出力またはデバッグ出力を <see cref="T:log4net.ILog" /> に転送します。</summary>
/// <example><![CDATA[
/// // リスナーを追加する
/// System.Diagnostics.Trace.Listeners.Add(new ScrapCode.DotNet.Diagnostics.Log4netTraceListener());
/// // メッセージを出力
/// System.Diagnostics.Debug.WriteLine("Debug message.");
/// System.Diagnostics.Trace.WriteLine("Trace message.");
/// ]]></example>
public class Log4netTraceListener : System.Diagnostics.TraceListener
{
/// <summary>ロガー</summary>
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>ログメッセージ</summary>
private static readonly System.Text.StringBuilder msg = new System.Text.StringBuilder();
public Log4netTraceListener() { }
public Log4netTraceListener(string name) : base(name) { }
public override void Close()
{
if (!log.IsDebugEnabled) return;
if (msg.Length > 0) Flush();
}
public override void Flush()
{
if (!log.IsDebugEnabled) return;
lock (msg)
{
if (msg.Length > 0) log.Debug(msg);
msg.Clear();
}
base.NeedIndent = true;
}
public override void Write(string message)
{
if (!log.IsDebugEnabled) return;
if (base.NeedIndent) WriteIndent();
lock (msg) msg.Append(message);
}
public override void WriteLine(string message)
{
if (!log.IsDebugEnabled) return;
if (base.NeedIndent) WriteIndent();
lock (msg) msg.Append(message);
Flush();
}
}
}
/* ** 構成ファイルの記載例 **
<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<add name="log4netTraceListener" type="ScrapCode.DotNet.Diagnostics.Log4netTraceListener, ConsoleApplication1" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
*/ |
リスナーの設定
標準である TextWriterTraceListener などと同様に、アプリケーション内で Listeners コレクション に追加するか、構成ファイルの system.diagnostics 要素で指定する。
System.Diagnostics.Trace.Listeners.Add(new ScrapCode.DotNet.Diagnostics.Log4netTraceListener());
<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<add name="log4netTraceListener" type="ScrapCode.DotNet.Diagnostics.Log4netTraceListener, ConsoleApplication" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Flush で、ログ出力するようにしているので、autoflush="true" と autoflush を有効にすると、Write が呼ばれるたびに、ログが1行出力される。
最終更新時間:2023年05月26日 13時14分30秒 指摘や意見などあればSandBoxのBBSへ。
Log4netTraceListener.cs