我可以将参数传递给自定义log4net Appender的构造函数吗?

时间:2010-10-15 10:24:00

标签: constructor log4net

我想将参数传递给自定义appender的构造函数,所以我想我必须重写Appenders的初始化机制。问题是我在文档中找不到一种方法来解决它,这让我觉得它不可能(或者说文档不完整)。

对于版本1.2.10,如果不修改源代码,则无法做到这一点。相关部分位于Repository\Hierarchy\XmlHierarchyConfigurator.cs:L286

IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));

正如你所看到的,它应该使用这种重载(或者那种方式)来让我满足我的需求。

Activator.CreateInstance(Type, Object[])

2 个答案:

答案 0 :(得分:4)

我不确定我是否了解您的目标,但如果您希望您的appender可配置,您基本上必须在您的appender上公开属性。然后,您可以以编程方式或在配置文件中设置此属性。

UdpAppender公开了这样的属性:

public int LocalPort
{
   get; set;
}

(它实际上有点复杂,因为它们会检查setter中的值是否为有效端口。)

在配置文件中,您可以像这样使用它:

<localPort value="8080" />

这对于简单类型(如string,int)非常有效,但也适用于某些复杂类型,如IPAddress。如果你有自己的类型,那么它将更难以使它工作,我将不得不首先检查它是如何完成的。

答案 1 :(得分:1)

对于版本1.2.10,如果不修改源代码,则无法做到这一点。

相关部分位于第286行的Repository \ Hierarchy \ XmlHierarchyConfigurator.cs中:

`IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));`

正如您所看到的,它应该使用

Activator.CreateInstance(Type, Object[])
重载(或类似的方式)来满足我的需求。