Как сделать определенный фрагмент необязательным в шаблоне макета NLog?
У меня есть собственный рендеринг макета с именем job. Он содержит несколько элементов, которые используются в нашем приложении app.config:
<variable name="jobHost" value = "${job:item=host}" />
<variable name="jobService" value = "${job:item=service}" />
<variable name="jobNS" value = "${job:item=ns}" />
<variable name="jobName" value = "${job:item=name}" />
<variable name="jobKind" value = "${job:item=kind}" />
<variable name="jobScheduleId" value = "${job:item=scheduleId}" />
<variable name="jobLayout" value = "[H:${jobHost} S:${jobService} NS:${jobNS} N:'${jobName}' K:${jobKind} S:${jobScheduleId}]" />
<variable name="layout" value = "${longdate} [${threadid}] ${machinename} ${jobLayout} ${uppercase:inner=${level}} ${logger} - ${message} ${onexception:${newline}${exception:format=ToString:innerFormat=ToString:maxInnerExceptionLevel=2}}" />
<targets>
<target name="ThreadLog" xsi:type="ThreadSpecificTarget" />
<target xsi:type="SplitGroup" name="AllTargets">
<target name="TextFile" xsi:type="File" fileName="C:\Log\QuartzBackgroundEngine.txt" layout="${layout}"/>
<target name="Console" xsi:type="ColoredConsole" layout="${layout}"/>
</target>
</targets>
Когда средство рендеринга макета решает, что нет доступных данных о задании, сообщения журнала содержат строку [H: S: NS: N:'' K: S:]
. Я хочу исключить его.
Итак, я попытался заменить ${jobLayout}
на ${jobLayout:when=jobName!=’’}
, но он не работает, потому что NLog считает, что jobLayout
должен соответствовать средству рендеринга макета, а не переменной, что здесь.
Как изменить макет, чтобы ${jobLayout}
включался только в том случае, если ${jobName}
не пуст?
Ответы
Ответ 1
У меня возникла аналогичная проблема, когда я хотел сделать для отображения специального форматирования, когда переменная не была пустой.
Я немного вдохновил Самые полезные конфигурации NLog
${when:when=length('${jobName}') > 0:inner=${jobLayout}}
Я не уверен, будет ли это на вас 100%, но это шаг в правильном направлении.
Ответ 2
Вы пытались сделать рендерером makeEmpty?
https://github.com/nlog/NLog/wiki/WhenEmpty-Layout-Renderer