删除Log4net(null):条件输出

时间:2013-09-15 17:06:37

标签: log4net

我正在尝试抑制“(null)”输出。如果我有这个转换模式:

%property{MyProp}

...如果MyProp为null,则输出为:

(null)

在大多数情况下这很好。但是,如果我不想输出“(null)”怎么办?可以这样做吗?

如果我的conversionPattern看起来像这样,问题会变得更有趣:

MY_PROP=%property{MyProp}

在这种情况下,即使我找到一种方法来抑制“(null)”,我的输出仍然是:

MY_PROP=

理想情况下,如果值为null,我想要抑制与“my prop”相关的所有内容。如果我发明了自己的语法,可能是:

%(MyProp,MY_PROP=%MyProp)

如果第一个参数为null,这将使log4net抑制第二个参数中指定的转换模式。

除了我的想法,是否有一种真正的方式在log4net中执行此操作?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是创建自定义PatternLayoutConverter。如果属性值为null,请写上customNullReplacement(如果需要动态性,甚至可以基于Option键)。

namespace LogUtils
{
    public class CustomNullProperty : PatternLayoutConverter
    {
        private static string customNullReplacement = "????";
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                var prop = loggingEvent.LookupProperty(Option);
                if(prop == null)
                {
                    prop = customNullReplacement;
                }
                WriteObject(writer, loggingEvent.Repository, prop);
            }
            else
            {
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }
        }
    }
}

然后,在Log4Net配置(基于XML的配置示例下)中,使用<converter>标签定义此转换器,并在conversionPattern上使用它:

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

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

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