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 的一部分,通过使我的基类继承 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 回答