1

デフォルトの 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プロパティがfalseXmlWriterTraceListener の場合と同様に残されることを意味するため、TraceData / TraceEvent が呼び出されるたびに、より高いレベルのトレース システムがロックされます。よろしいですか?

その周りにロックを追加し、オーバーライドされた プロパティstatic CircularStream m_streamから返すことには利点がありますか? それとも、XmlTraceListener で既に行われていることと同じでしょうか?trueIsThreadSafe

CircularTraceListener をスレッドセーフかつ効率的にするにはどうすればよいですか?

4

1 に答える 1

1

CircularTraceListener基本的に欠陥があると思います。お気づきのとおり、static m_stream. しかし、さらに悪いことに、 a を作成するCircularTraceListenerと、新しいストリームがベース ( XmlWriterTraceListener) に渡されます。つまり、最後CircularTraceListenerに作成されたストリームしか認識していませんが、基本クラスは多くのストリームの 1 つを使用している可能性があります。そしてもちろん、が破棄された場合、基本クラスは共有オブジェクトを破棄します。CircularTraceListenerm_stream

CircularTraceListener何もベースにせず、ゼロから始めることをお勧めします。

アップデート:

循環ログのようなものについては、log4net や NLog のようなものの方がはるかにうまくいきました。

于 2013-03-15T19:13:29.877 に答える