删除Log4net(null):条件输出

删除Log4net(null):条件输出,log4net,Log4net,我试图抑制“(null)”输出。如果我有这种转换模式: %property{MyProp} …如果MyProp为null,则输出为: (null) 在大多数情况下,这是好的。但是如果我不想输出“(null)”呢?这能做到吗 如果我的转换模式如下所示,问题会变得更有趣: MY_PROP=%property{MyProp} 在这种情况下,即使我找到了抑制“(null)”的方法,我的输出仍然是: MY_PROP= 理想情况下,如果值为null,我希望抑制与“我的道具”相关的所有内容。如果我发明

我试图抑制“(null)”输出。如果我有这种转换模式:

%property{MyProp}
…如果MyProp为null,则输出为:

(null)
在大多数情况下,这是好的。但是如果我不想输出“(null)”呢?这能做到吗

如果我的转换模式如下所示,问题会变得更有趣:

MY_PROP=%property{MyProp}
在这种情况下,即使我找到了抑制“(null)”的方法,我的输出仍然是:

MY_PROP=
理想情况下,如果值为null,我希望抑制与“我的道具”相关的所有内容。如果我发明了自己的语法,它可能是:

%(MyProp,MY_PROP=%MyProp)
如果第一个参数为null,这将使log4net抑制在第二个参数中指定的转换模式


撇开我的思绪不谈,在log4net中有没有真正的方法可以做到这一点呢?

一种方法是创建一个自定义的
PatternLayoutConverter
。如果属性值为
null
编写
customNullReplacement
(如果需要一些动态性,甚至可以基于
选项
键)

然后,使用Log4Net配置(下面是基于XML的配置示例)上的
标记定义此转换器,并在
转换模式上使用它:

 <layout type="log4net.Layout.PatternLayout">
     <converter>
         <name value="customNullProp" />
         <type value="LogUtils.CustomNullProperty, DLLNAME" />
     </converter>
    <conversionPattern value="customNullProp{PropertyName} %message%newline"/>
 </layout>

还有其他方法,比如为
System.Object
创建渲染器,但我发现这种方法更明确

对于第二个需求,使用自定义转换器,只需在自定义
转换器
编写器中移动前缀即可

 <layout type="log4net.Layout.PatternLayout">
     <converter>
         <name value="customNullProp" />
         <type value="LogUtils.CustomNullProperty, DLLNAME" />
     </converter>
    <conversionPattern value="customNullProp{PropertyName} %message%newline"/>
 </layout>