Могу ли я использовать два разных макета в одной цели в NLog?

#nlog

#nlog

Вопрос:

У меня есть два макета в nlog.config. один — макет по умолчанию, а другой — ErrorLayout, в котором есть дополнительные свойства. проблема в том, что я хочу добавить target и хочу использовать оба макета для LogLevel.Ошибка я должен использовать ErrorLayout, а для других уровней я должен использовать defaultLayout. я не хочу создавать две цели, потому что две цели создают два разных файла и хранят в нем журналы. но я хочу, чтобы оба макета были объединены в одну цель. могу ли я это сделать? Как? кто-нибудь может мне помочь в этом?

введите описание изображения здесь

Ответ №1:

Другой вариант — вы используете две цели, нацеленные на один и тот же файл. Если вы не включаете keepfileopen, то это тоже хорошее решение.

Например:

 <nlog>
    <targets>
        <target type="file" name="erp" layout="${message}" fileName="log-${shortdate}.log" />
        <target type="file" name="erp-error" layout="${message} ${exception:format=tostring}" fileName="log-${shortdate}.log" />
    </targets>

    <rules>
        <logger name="*" minLevel="Error" writeTo="erp-error" final="true" /> <!-- after match events won't be processed futher due to the final attribute -->
        <logger name="*" minLevel="Debug" writeTo="erp" />
    </rules>
</nlog>
  

Ответ №2:

Прямо сейчас ваши DefaultLayout и ErrorLayout довольно просты, поэтому вы можете просто сделать это:

 <nlog>
    <variable name="DefaultLayout" value="${message}" />
    <variable name="ErrorLayout" value="${message} ${exception:format=tostring}" />
    <variable name="DynamicLayout= value="${when:when=level<=LogLevel.Info:inner=${DefaultLayout}:else=${ErrorLayout}}" />

    <targets>
        <target type="file" name="erp" layout="${DynamicLayout}" fileName="log-${shortdate}.log" />
    </targets>

    <rules>
        <logger name="*" minLevel="Debug" writeTo="erp" />
    </rules>

</nlog>
  

Смотрите также https://github.com/nlog/NLog/wiki/When-Layout-Renderer

Обратите внимание, что NLog может работать плохо, если вы включите тяжелые layoutrenders в ErrorLayout. Например. как ${callsite}