Как настроить цель NLog только для исключений журнала?

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

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

2 ответов


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

вот пример 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 пример на примере из from здесь. Как это должно работать, если мой конфигурация правильная, заключается в том, что все сообщения будут записываться в "журнал.txt "и сообщения с ненулевым исключением будут регистрироваться в" Honeypot.формат txt."


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

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