EnterpriseLibrary CustomTraceListener不尊重TextFormatter

时间:2012-09-23 15:58:00

标签: logging enterprise-library

我有一个登录到环形缓冲区的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>();
            }
        }
    }
}

它通常有效,但我无法将其配置为使用自定义文本格式。在下面的配置中,我配置了两个跟踪侦听器,一个配置为平面文件,另一个配置为我的自定义侦听器。前者使用“Brief formatter”正确记录,而后者失败并使用默认格式。为什么呢?

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

2 个答案:

答案 0 :(得分:3)

Chris Tavares是对的。解决方案如下:

  1. 覆盖TraceData()方法,
  2. 获取格式化程序的实例
  3. call formatter.Format,
  4. 将其传递给WriteLine()
  5. 以下是一个示例:

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

答案 1 :(得分:2)

您无法免费获取格式化程序 - 您需要编写跟踪侦听器,以便它获取格式化程序的实例并实际调用它。