Я не могу сказать, что я действительно пытался это сделать, но вы могли бы использовать при фильтре и условие для достижения того, что вы хотите.
Вот пример со страницы condition
:
<rules>
<logger name="*" writeTo="file">
<filters>
<when condition="length(message) > 100" action="Ignore" />
<when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" />
<when condition="(level >= LogLevel.Debug and contains(message,'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
<when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" />
</filters>
</logger>
</rules>
Чтобы достичь своей цели, вы могли бы сделать filter
следующим образом:
<rules>
<logger name="*" writeTo="file">
<filters>
<when condition="length('${exception}') > 0" action="Log" />
</filters>
</logger>
</rules>
Идея состоит в том, чтоВы хотите регистрировать сообщение, только если длина строки исключения> 0. Некоторые из примеров when condition
использовали синтаксис NLog LayoutRenderer (например, ${message}
), а некоторые - нет (например, message
).Я не уверен, какой правильный или какой синтаксис использовать в какой ситуации.Пример, который я разместил выше, может привести к тому, что сообщения будут регистрироваться ТОЛЬКО в случае наличия исключения.Вы также должны иметь возможность настроить так, чтобы ваши сообщения для одной цели регистрировались «нормально», а сообщения для вашей «ExceptionHoneypotTarget» регистрировались только в случае наличия исключения.
Может быть что-то вроде этого:
<rules>
<logger name="*" writeTo="ExceptionHoneypot">
<filters>
<when condition="length('${exception}') > 0" action="Log" />
</filters>
</logger>
<logger name="*" writeTo="file">
</logger>
</rules>
Как я уже упоминал ранее, я на самом деле не пробовал ничего из этого, но кажется, что вы должны быть в состоянии сделать это, надеюсь, похоже на то, что показано выше.
В качестве альтернативы, вы могли быиспользуйте FilteringWrapper вокруг вашей HoneypotTarget.Конфигурация может выглядеть примерно так:
<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="Honeypot" xsi:type="FilteringWrapper"
condition="length('${exception}')>0">
<target xsi:type="File" fileName="${basedir}/Honeypot.txt" />
</target>
<target name="normal" xsi:type="File" fileName="${basedir}/Log.txt" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="Honeypot,normal" />
</rules>
</nlog>
Я основал пример FilteringWrapper
на примере из здесь .Если моя конфигурация верна, все должно работать так, что все сообщения будут записываться в файл «Log.txt», а сообщения с ненулевым исключением будут записываться в «Honeypot.txt».