NLog布局渲染器似乎无法在配置中工作

时间:2019-06-19 19:36:59

标签: c# nlog

nlog.config中使用ASP.NET v4.7.2,我有这个目标:

<target name="logfile" xsi:type="File" fileName="{gdc:item=logFileName}" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"/>

Global.asax.cs:Application_Start中,我有这个:

GlobalDiagnosticsContext.Set("logFileName", @"c:\\Temp\\nlog-all-${shortdate}.txt");

出于很好的考虑:

LogManager.Configuration = LogManager.Configuration.Reload();

在紧随其后的行上放置一个断点,并深入研究LogManager.Configuration属性,我发现File日志目标对其FileName属性具有以下要求:

FileName="{gdc:item=logFileName}"

当我写记录器时,它会在应用程序根目录中创建一个文件-您猜到了-{gdc:item=logFileName}

在“命令”窗口中,紧随GDC设置的一个断点,我执行了Kristensen先生在他的回答中建议的空日志操作:

((NLog.Targets.FileTarget)LogManager.Configuration.AllTargets[1]).FileName.Render(NLog.LogEventInfo.CreateNullEvent())

结果是{gdc:item=logFileName}

换句话说,GDC布局渲染器似乎无法正常工作。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

按预期工作。 FileName-property是一个NLog布局。意味着它可以根据LogEvent动态地解析其值。使用调试器查看FileName属性时,您未提供LogEvent。

尝试在调试手表中执行此操作(记住将{gdc}改成${gdc}

fileTarget.FileName.Render(NLog.LogEventInfo.CreateNullEvent());

NLog布局引擎允许您捕获所有类型的上下文信息,而无需将其添加到实际的LogEvent中。但也可以提取context from the LogEvent

另请参阅https://nlog-project.org/config/?tab=layout-renderershttps://nlog-project.org/config/?tab=layouts

但是${gdc}用于全局变量,而不用于嵌入布局渲染器。相反,您可以这样配置:

<target name="logfile" xsi:type="File" fileName="${gdc:item=logDirectory}/nlog-all-${shortdate}.txt" ... />

并像这样分配GDC变量:

GlobalDiagnosticsContext.Set("logDirectory", @"c:\\Temp");

如果您绝对需要在值中嵌入布局渲染器逻辑,则应考虑使用${var}而不是${gdc}