如何配置NLog目标只记录异常?

时间:2012-02-16 06:55:21

标签: .net nlog

当出现异常时,似乎有很多关于如何记录额外信息的信息和文档,但是我在尝试创建一个本质上是异常蜜罐的目标时遇到了麻烦。我不想筛选各种日志文件,试图查看是否记录了任何异常,我只想将所有异常的副本转到写入exceptions.log文件的特定目标。

我该怎么做?

2 个答案:

答案 0 :(得分:18)

我不能说我实际尝试过这个,但您可以使用when filtercondition来实现您的目标。

以下是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>

想法是,如果异常字符串的长度为&gt;,您只想记录消息。 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>

正如我早些时候提到的那样,我实际上并没有尝试过这一点,但似乎你应该能够做到这一点,希望与上面所示类似。

或者,您可以在HoneypotTarget周围使用FilteringWrapper。配置可能如下所示:

<?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示例基于来自here的示例。它的工作方式,如果我的配置正确,是所有消息都将记录到“Log.txt”,具有非null异常的消息将记录到“Honeypot.txt”。

答案 1 :(得分:7)

请注意,如果您只想 例外,则过滤器应为:

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