#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}