Здравствуйте,
Пользуемся на проекте NLog логгером.
С некоторых пор стали использовать контексты (GDC, MDC, MDLC, NDC, NDLC).
Например
var contextID = "например ID сессии";
using (NestedDiagnosticsLogicalContext.Push(contextID))
{
// ...
log.Info("сообщение 1");
// ...
log.Info("сообщение 2");
// ...
log.Info("сообщение 3");
// ...
}
соответсвенно в лог дополнительно к самим текстам сообщений можно выводить (в синтаксисе NLog layout) что-то вроде:
CONTEXT:${ndlc}
${longdate} ${level} CONTEXT:${ndlc}${newline}всё естальное
Но контекст далеко не всегда задан.
При этом я знаю, что в NLog можно layout с условиями задавать (я про
$when).
Но вот тут и затык — я не могу сообразить, как его отформатировать так, чтобы "
CONTEXT:${ndlc}" выводилось только, если контекст задан?
Спасибо, очень помогло!
В итоге родился вот такой nlog.config (обратите внимание на переменную
CONTEXT):
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true">
<variable name="LEVEL" value="${pad:padding=5:inner=${level:uppercase=true}}" />
<variable name="CONTEXT" value="${when:when='${ndlc}'!='':inner=CTX=${ndlc}}" />
<variable name="CALLER" value="${logger}:${callsite-linenumber}:${callsite:includeNamespace=false:className=false:methodName=true}()" />
<targets>
<target name="ColoredConsole" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false"
layout="${newline}${time:invariant=true} ${var:LEVEL} ${var:CONTEXT}${newline}${var:CALLER}${newline}${message}"
>
<highlight-row condition="level == LogLevel.Trace" foregroundColor="Cyan" />
<highlight-row condition="level == LogLevel.Debug" foregroundColor="Green" />
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" />
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" />
<highlight-row condition="level == LogLevel.Error" foregroundColor="Red" />
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" />
</target>
<target name="TraceLog" xsi:type="File"
layout="${newline}${time:invariant=true} ${var:LEVEL} ${var:CONTEXT} ${newline}${var:CALLER}${newline}${message}"
fileName="${basedir}/Logs/${machinename}_${shortdate}_${aspnet-application}.log"
keepFileOpen="false"
encoding="utf-8"
maxArchiveFiles="1"/>
<target name="Debugger" xsi:type="Debugger"
layout="${time:invariant=true} ${var:LEVEL} ${var:CONTEXT} ${var:CALLER} ${message}"
/>
</targets>
<rules>
<logger name="*" minlevel="Trace" maxlevel="Fatal" writeTo="ColoredConsole" />
<logger name="*" minlevel="Trace" maxlevel="Fatal" writeTo="TraceLog" />
<logger name="*" minlevel="Trace" maxlevel="Fatal" writeTo="Debugger" />
</rules>
</nlog>