Как настроить цель NLog для регистрации только исключений? - PullRequest
6 голосов
/ 16 февраля 2012

Кажется, что есть много информации и документации о том, как регистрировать дополнительную информацию, когда присутствует исключение, но у меня возникают проблемы при попытке выяснить, как создать цель, которая по сути является приманкой для исключений. Вместо того, чтобы просеивать различные файлы журнала, пытаясь проверить, не были ли в журнале зарегистрированы какие-либо исключения, я бы просто хотел, чтобы копия всех исключений направлялась к определенной цели, которая записывает данные в файл exceptions.log.

Как мне это сделать?

Ответы [ 2 ]

18 голосов
/ 16 февраля 2012

Я не могу сказать, что я действительно пытался это сделать, но вы могли бы использовать при фильтре и условие для достижения того, что вы хотите.

Вот пример со страницы 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».

7 голосов
/ 10 февраля 2014

Обратите внимание, что если вы хотите только исключения, ваш фильтр должен быть:

    <when condition="length('${exception}') = 0" action="Ignore" />
...