リング バッファーにログを記録する 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>