我正在尝试抑制“(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中执行此操作?
答案 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
编写器中移动前缀即可。