如何将配置属性列表读入自定义log4net筛选器

时间:2014-04-03 17:31:06

标签: log4net log4net-configuration log4net-filter

我正在log4net中创建自定义过滤器。我发现我可以将配置中的元素映射到过滤器类中的属性,如下所示:

<filter type="ConsoleApplication1.CustomFilter">
    <FooKey value="FooValue"/>
</filter>

public class CustomFilter : FilterSkeleton
{
    public string FooKey { get; set; }

    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        return FilterDecision.Accept;
    }
}

我想要做的是设置这样的项目列表:

<filter type="ConsoleApplication1.CustomFilter">
    <FooKey value="FooValue"/>
    <FooKey value="BarValue"/>
</filter>

public class CustomFilter : FilterSkeleton
{
    public string[] FooKeys { get; set; }

    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        return FilterDecision.Accept;
    }
}

如果可以,我该怎么做?

1 个答案:

答案 0 :(得分:5)

您可以在SetParameter的{​​{1}}方法中找到导致此行为的代码。发生的是:

  • 如果xml元素引用属性,则会有一个赋值
  • 如果xml元素引用方法,则将使用xml参数
  • 调用该方法

您无法从* .config文件中分配数组,因为配置程序仅处理标量值。但是,您可以创建一个方法,将新参数推送到自定义过滤器:

XmlHierarchyConfigurator

然后在您的配置文件中,您可以执行以下操作:

public class CustomFilter : FilterSkeleton
{
    public string[] FooKeys { get; set; }

    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        return FilterDecision.Accept;
    }

    public void AddFooKey(string text)
    {
        var temporaryFooKey = new List<string>(FooKeys ?? new List<string>().ToArray());
        temporaryFooKey.Add(text);
        FooKeys = temporaryFooKey.ToArray();
    }
}

请注意,如果您不想更改xml元素的名称,可以使用<filter type="ConsoleApplication1.Filters.CustomFilter"> <FooKey name="AddFooKey" value="FooValue"/> <AddFooKey value="BarValue"/> </filter> 属性来指定必须访问过滤器的哪个部分,并且您还可以直接使用方法名称。