我有一个场景,如果我可以在跟踪点字符之前记录记录器的名称,我可以减少配置文件中的目标数量。
使用${logger:shortName=true}
可以呈现记录器的短名称,即定义the part after the trailing dot character。但是我要记录的是点字符前面的部分。
例如,我可能使用MyNamespace.MyClass
的记录器名称,使用${logger:shortName=true}
我会得到MyClass
的值,但我看不到获得{{1}值的方法使用MyNamespace
时返回${logger:shortName=false}
的全名。
所以我想知道这是否可行?
答案 0 :(得分:4)
我建议编写一个自定义包装器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方法应该接收logger的全名(如果您使用类名作为记录器名称,则为完全限定的类名)。在内部转换中,只需返回“文本”(即记录器名称)的内容,但不包括最后'.'
。
您还必须在NLog配置中添加对程序集的引用。
<extensions>
<add assembly="MyAssembly"/>
</extensions>
我的基础是你可以在NLog repository找到的WrapperLayoutRenderers。
祝你好运!