4

我有一个场景,如果我可以在尾随点字符之前记录记录器的名称,我可以减少配置文件中的目标数量。

使用${logger:shortName=true}它可以呈现记录器的短名称,即根据定义,在尾随点字符之后的部分。但是我要记录的是点字符之前的部分。

例如,我可能使用 的记录器名称MyNamespace.MyClass,使用${logger:shortName=true}我会得到 的值,MyClass但我看不到获取 的值的方法,就像MyNamespace使用${logger:shortName=false}返回的全名一样MyNamespace.MyClass

所以我想知道这是否可能?

4

1 回答 1

6

我建议编写一个自定义包装器 LayoutRenderer,如下所示:

using NLog.Config;
using NLog.LayoutRenderers;

namespace NLog.LayoutRenderers.Wrappers
{
    [LayoutRenderer("loggerprefix")]
    [ThreadAgnostic]
    public sealed class LoggerPrefixRendererWrapper : WrapperLayoutRendererBase
    {
        protected override string Transform(string text)
        {
            return text.Substring(0,text.LastIndexOf('.'));
        }
    }
}

这个想法是您可以logger像这样将这个包装器应用到 LayoutRenderer:

${loggerprefix:${logger}}

Transform 方法应该接收记录器的全名(如果您使用类名作为记录器名称,则为完全限定的类名)。在 Transform 内部,只需将“文本”的内容(即记录器名称)返回到最后一个,但不包括最后一个'.'.

您还必须在 NLog 配置中添加对程序集的引用。

  <extensions>
    <add assembly="MyAssembly"/>
  </extensions>

我基于您可以在NLog 存储库中找到的 WrapperLayoutRenderers 。

祝你好运!

于 2012-06-11T17:14:30.627 回答