我有一个登录到环形缓冲区的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>
答案 0 :(得分:3)
Chris Tavares是对的。解决方案如下:
以下是一个示例:
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)
您无法免费获取格式化程序 - 您需要编写跟踪侦听器,以便它获取格式化程序的实例并实际调用它。