トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

DotNet/Log4netTraceListener

INDEX

Log4net トレースリスナー

.NET 標準で用意されている、トレース出力またはデバッグ出力のメッセージを、log4net のロガーを通してデバック出力するトレースリスナー。

トレース出力およびデバッグ出力を監視するリスナーの抽象クラス System.Diagnostics.TraceListener を継承し、 Write および WriteLine メソッドを実装して作成する。

作成したリスナーは、アプリケーション内で Listeners コレクション に追加するか、構成ファイルの system.diagnostics 要素で指定する。

 サンプルコード

StringBuilder で、出力メッセージをためておき、WriteLine もしくは Flush で、デバックログに出力する。namespace は適に変更のこと。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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