3

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

%property{MyProp}

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

(null)

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

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

MY_PROP=%property{MyProp}

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

MY_PROP=

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

%(MyProp,MY_PROP=%MyProp)

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

除了我的沉思,在 log4net 中是否有真正的方法可以做到这一点?

4

1 回答 1

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());
            }
        }
    }
}

<converter>然后,您在 Log4Net 配置(下面基于 XML 的配置示例)上定义此转换器 - 使用标签 - 并将其用于您的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中。

于 2018-07-04T10:31:07.247 回答