デフォルトの Microsoft の XmlTraceListener を、ファイル サイズの制限または現在の日付に基づいてファイルを切り替えるリスナーに置き換えたいと考えています。ServiceTraceViewer ツールでファイルを開くことができるように、デフォルトの XmlTraceListener ファイル形式を維持したいと考えています。
記事http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListenerを見つけましたが、コメントから、提案されたパッチを適用した後でも、このリスナーには不安定性があるようです。
次に、マイクロソフト独自の CircularListener の実装を見つけましたhttp://msdn.microsoft.com/en-us/library/aa395205.aspx
拡張したかったのですが、あることに気付きました
static CircularStream m_stream = null;
その後、この変数はロックなしでアクセスされます。http://msdn.microsoft.com/en-us/library/ms733025.aspxを読むと、XmlWriterTraceListener 自体でさえスレッドセーフではないことがわかりました。MSDN は次のように述べています。
System.Diagnostics.XmlWriterTraceListener はスレッド セーフではないため、トレース ソースは、トレースを出力するときにリソースを排他的にロックする場合があります。このリスナーを使用するように構成されたトレース ソースに多くのスレッドがトレースを出力すると、リソースの競合が発生し、重大なパフォーマンスの問題が発生する可能性があります。この問題を解決するには、スレッドセーフなカスタム リスナーを実装する必要があります。
基本的に、これはTraceListener.IsThreadSafe
プロパティがfalse
XmlWriterTraceListener の場合と同様に残されることを意味するため、TraceData / TraceEvent が呼び出されるたびに、より高いレベルのトレース システムがロックされます。よろしいですか?
その周りにロックを追加し、オーバーライドされた プロパティstatic CircularStream m_stream
から返すことには利点がありますか? それとも、XmlTraceListener で既に行われていることと同じでしょうか?true
IsThreadSafe
CircularTraceListener をスレッドセーフかつ効率的にするにはどうすればよいですか?