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

Sim*_*one 8 log4net constructor

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

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

IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));
Run Code Online (Sandbox Code Playgroud)

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

Activator.CreateInstance(Type, Object[])
Run Code Online (Sandbox Code Playgroud)

Ste*_*gli 4

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

UdpAppender 公开如下属性:

public int LocalPort
{
   get; set;
}
Run Code Online (Sandbox Code Playgroud)

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

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

<localPort value="8080" />
Run Code Online (Sandbox Code Playgroud)

这对于 string、int 等简单类型非常有效,但也适用于IPAddress. 如果您有自己的类型,那么使其工作会更加困难,我必须首先检查这是如何完成的。

  • 也许不是很好,但我认为您可以在应用程序中使用一些全局存储库(例如 log4net 全局上下文)。 (3认同)
  • Stefan,问题正是您在最后写的问题:我必须提供一个在运行时实例化的复杂对象。无法通过 XML 配置提供它。 (2认同)