簡體   English   中英

NLog 布局渲染器似乎在配置中不起作用

[英]NLog layout renderers don't seem to work in configuration

使用 ASP.NET v4.7.2,在nlog.config我有這個目標:

<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 布局渲染器不起作用。

我在這里做錯了什么?

按預期工作。 FileName-property 是一個 NLog 布局。 意味着它可以根據 LogEvent 動態解析其值。 使用調試器查看 FileName 屬性時,您沒有提供 LogEvent。

嘗試在調試監視中執行此操作(記住將{gdc}更正為${gdc}

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

NLog 布局引擎允許您捕獲所有類型的上下文信息,而無需將其添加到實際的 LogEvent。 但也可以從 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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM