5

だから私はこれとして人生を始めたカスタムトレースリスナーを持っています:

http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener

これを変更して、Log4Net RollingFileAppender のように動作するようにしました ( http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.htmlを参照) 。

コードを実行すると、構成ファイルのカスタム属性からプロパティ/フィールド値が設定されていないことがわかりました。

実行時にオブジェクトを分析すると、Attributes プロパティ (this.Attributes) に何も含まれていないことがわかります。

これを修正する方法はありますか?

これらまたは何かを手動で入力することになっていますか?

ここにコードサンプルがあります:

[HostProtection(Synchronization = true)]
public class RollingXmlWriterTraceListener : XmlWriterTraceListener
{
    public RollingXmlWriterTraceListener(string filename)
        : base(filename)
    {
        _basicTraceFileName = filename;
        LoadAttributes();
    }

LoadAttributes メソッドで、次に行います...

if (Attributes.ContainsKey("maxTraceFileCount"))
{
   string attributeValue = Attributes["maxTraceFileCount"];

問題は、「属性」に何も含まれていないことです。このクラスは、属性を含む構成情報を使用してフレームワーク コードからインスタンス化されます...

 <sharedListeners>
    <add type="emedia.Common.Wcf.RollingXmlWriterTraceListener, emedia.Common.Wcf" 
         name="System.ServiceModel.XmlTrace.Listener" 
         traceOutputOptions="None" 
         initializeData="C:\Logs\MyTraceFileName.svclog" 
         MaxTraceFileSize="1048576"
         MaxTraceFileCount="10"
    />
 </sharedListeners>

編集2:

XmlWriterTraceListener クラスは .Net の一部であり、Inherit の基本クラスを Attributes プロパティにします。

構成では、任意の属性を指定できるはずであり、コードで次のようなことを行います...

var attValue = Attributes["something"];

...しかし、何らかの理由でこれはnullに戻ります(属性がコレクションにありません)。

4

2 に答える 2

7

Attributes コレクションは、リスナーのインスタンスが完全に構築されるまで、構成ファイルから取り込まれません。

コンストラクターで LoadAttributes メソッドを呼び出す代わりに、リスナー オブジェクトが完全にインスタンス化された後、最初に使用される前に呼び出されるようにする必要があります。

于 2014-03-05T19:01:46.503 に答える
2

これを修正していない場合、または誰かの将来の助けのために...

今日はこれを見てきました。GetSupportedAttributes のオーバーライドを含めましたか?

今朝しばらくの間、私は同じ問題を抱えていました。これを含めて、私が期待している属性をリストすることで解決しました。したがって、上記の例では、必要になります

protected override string[] GetSupportedAttributes()
{
    return new[] { "MaxTraceFileSize" };
}
于 2012-11-05T01:17:50.437 に答える