所以我有一个自定义跟踪监听器,它开始了它的生命:
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(该属性不在集合中)。
答案 0 :(得分:7)
在完全构建侦听器实例之后 之后,不会从配置文件中填充属性集合。
不是在构造函数中调用LoadAttributes方法,而是需要确保在完全实例化侦听器对象之后但在第一次使用它之前调用它。
答案 1 :(得分:2)
万一你没有解决这个问题,或者未来任何人的帮助......
我今天一直在看这个。您是否包含了GetSupportedAttributes的覆盖?
今天早上有一段时间我遇到了同样的问题。包括这个并列出我期望解决的那些属性。所以在上面的例子中你需要
protected override string[] GetSupportedAttributes()
{
return new[] { "MaxTraceFileSize" };
}