Похоже, что средства визуализации макетов NLog не работают в конфигурации - PullRequest
1 голос
/ 19 июня 2019

Используя 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, я выполнил действие нулевого журнала, рекомендованное г-ном Кристенсеном в его ответе:

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

Результат был {gdc:item=logFileName}

Другими словами, похоже, что средство визуализации макета GDC не работает.

Что я здесь не так делаю?

1 Ответ

1 голос
/ 19 июня 2019

Работает как задумано.Свойство FileName является макетом NLog.Означает, что он может разрешать свое значение динамически в зависимости от LogEvent.При просмотре свойства FileName с использованием отладчика вы не предоставляете LogEvent.

Попробуйте сделать это в режиме отладки (не забудьте исправить {gdc} до ${gdc})

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

Движок NLog Layout позволяет вам захватывать все виды контекстной информации, не добавляя ее к реальному LogEvent.Но может также извлечь контекст из LogEvent .

См. Также https://nlog -project.org / config /? Tab = layout-renderers и https://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}.

...