0

リング バッファーにログを記録する CustomTraceListener があります。

namespace Sample
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Cognoware.Collections.Generic;
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;

    [ConfigurationElementType(typeof(CustomTraceListenerData))]
    public class CircularTraceListener: CustomTraceListener
    {
        private static RingBuffer<string> _ringBuffer = new RingBuffer<string>(200);
        private string tmp = String.Empty;
        public override void Write(string message)
        {
            tmp += message;
        }

        public override void WriteLine(string message)
        {
            _ringBuffer.Add(tmp + message);
            tmp = String.Empty;
        }

        public IEnumerable<string> Messages
        {
            get
            {
                return _ringBuffer.AsEnumerable<string>();
            }
        }
    }
}

通常は機能しますが、カスタムのテキスト形式を使用するように構成できませんでした。以下の構成では、1 つはフラット ファイルに、もう 1 つはカスタム リスナーに、2 つのトレース リスナーを構成しました。前者は「簡易フォーマッタ」を使用して正しくログに記録しますが、後者は失敗し、デフォルトの形式を使用します。なんで?

<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
    <listeners>
        <add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            type="Sample.CircularTraceListener, CircularTraceListener, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
            name="CircularTraceListener" formatter="Brief Formatter" />
        <add name="Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            fileName="trace.log" formatter="Brief Formatter" /> 
    </listeners>
    <formatters>
        <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            template="{timestamp}  {message} {title} {dictionary({key} - {value}{newline})}"
            name="Brief Formatter" />
    </formatters>
    <categorySources>
        <add switchValue="All" name="General">
            <listeners>
                <add name="CircularTraceListener" />
                <add name="Flat File Trace Listener" />
            </listeners>
        </add>
    </categorySources>
</loggingConfiguration>
4

2 に答える 2

3

Chris Tavares は正しいです。解決策は次のとおりです。

  1. TraceData() メソッドをオーバーライドし、
  2. フォーマッタのインスタンスを取得する
  3. formatter.Format を呼び出します。
  4. それを WriteLine() に渡します

サンプルは次のとおりです。

namespace Sample1
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Cognoware.Collections.Generic;
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
    using System.Diagnostics;
    using Microsoft.Practices.EnterpriseLibrary.Logging;

    [ConfigurationElementType(typeof(CustomTraceListenerData))]
    public class CircularTraceListener: CustomTraceListener
    {
        private string tmp = String.Empty;
        public override void Write(string message)
        {
            tmp += message;
        }

        public override void WriteLine(string message)
        {
            tmp += message;
        }

        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        {
            if ((this.Filter == null) || this.Filter.ShouldTrace(eventCache, source, eventType, id, null, null, data, null))
            {
                if (data is LogEntry)
                {
                    if (this.Formatter != null)
                    {
                        WriteLine(this.Formatter.Format(data as LogEntry));
                    }
                    else
                    {
                        base.TraceData(eventCache, source, eventType, id, data);
                    }
                }
                else
                {
                    base.TraceData(eventCache, source, eventType, id, data);
                }
            }
        }
    }
}
于 2012-09-25T06:25:22.557 に答える
2

フォーマッターは無料では入手できません。フォーマッターのインスタンスを取得して実際に呼び出すように、トレース リスナーを作成する必要があります。

于 2012-09-25T06:08:06.003 に答える