NLog - target.layout выводить сонтекст только если он установлен
От: Yuri Abele Германия yabele.blogspot.com
Дата: 31.08.18 12:16
Оценка:
Здравствуйте,

Пользуемся на проекте 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}" выводилось только, если контекст задан?
Re: NLog - target.layout выводить сонтекст только если он ус
От: Jack128  
Дата: 31.08.18 13:15
Оценка:
Здравствуйте, Yuri Abele, Вы писали:

YA>Но вот тут и затык — я не могу сообразить, как его отформатировать так, чтобы "CONTEXT:${ndlc}" выводилось только, если контекст задан?


Ну я не использовал when, но судя по доке как то так:

${when:when='${ndlc}' != '':inner:'CONTEXT\:${ndlc\}'}
${longdate} ${level} CONTEXT:${ndlc}${newline}всё естальное
Отредактировано 31.08.2018 13:15 Jack128 . Предыдущая версия .
Re[2]: NLog - target.layout выводить сонтекст только если он ус
От: Yuri Abele Германия yabele.blogspot.com
Дата: 18.09.18 09:38
Оценка:
Спасибо, очень помогло!
В итоге родился вот такой 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>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.