使用 NLog 有没有办法在尾随点之前记录记录器的名称?

rrr*_*rrr 4 logging nlog

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

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

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

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

wag*_*ghe 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('.'));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

${loggerprefix:${logger}}
Run Code Online (Sandbox Code Playgroud)

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

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

  <extensions>
    <add assembly="MyAssembly"/>
  </extensions>
Run Code Online (Sandbox Code Playgroud)

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

祝你好运!