.net 如何将NLog目标配置为仅记录异常?

.net 如何将NLog目标配置为仅记录异常?,.net,nlog,.net,Nlog,在异常出现时,似乎有很多关于如何记录额外信息的信息和文档,但我在尝试如何创建一个本质上是异常蜜罐的目标时遇到了困难。我不想通过筛选各种日志文件来查看是否记录了任何异常,我只想将所有异常的副本转到写入exceptions.log文件的特定目标 我如何做到这一点?我不能说我确实尝试过这一点,但您可以使用a和a来实现您想要的 以下是条件页面中的一个示例: <rules> <logger name="*" writeTo="file"&g

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


我如何做到这一点?

我不能说我确实尝试过这一点,但您可以使用a和a来实现您想要的

以下是
条件
页面中的一个示例:

<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>
其思想是,只有当异常字符串的长度大于0时,才需要记录消息。一些
when条件
示例使用了NLog LayoutRenderer语法(例如
${message}
),而一些示例没有使用(例如
message
)。我不确定哪种是正确的,或者在哪种情况下使用哪种语法。我在上面直接发布的示例可能会导致仅当存在异常时才记录消息。您还应该能够进行配置,以便“正常”记录发送给一个目标的消息,并且仅当出现异常时才记录发送给“ExceptionHoneypotTarget”的消息

也许是这样的:

<rules>
    <logger name="*" writeTo="file">
        <filters>
            <when condition="length('${exception}') > 0" action="Log" />
        </filters>
    </logger>
</rules>
<rules>
    <logger name="*" writeTo="ExceptionHoneypot">
        <filters>
            <when condition="length('${exception}') > 0" action="Log" />
        </filters>
    </logger>
    <logger name="*" writeTo="file">
    </logger>
</rules>
<?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> 

正如我早些时候提到的,我实际上没有尝试过任何一种方法,但看起来你应该能够做到,希望类似于上面所展示的

或者,你也可以在你的蜜罐靶子周围放上一把。配置可能如下所示:

<rules>
    <logger name="*" writeTo="file">
        <filters>
            <when condition="length('${exception}') > 0" action="Log" />
        </filters>
    </logger>
</rules>
<rules>
    <logger name="*" writeTo="ExceptionHoneypot">
        <filters>
            <when condition="length('${exception}') > 0" action="Log" />
        </filters>
    </logger>
    <logger name="*" writeTo="file">
    </logger>
</rules>
<?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> 


我基于来自的一个示例创建了
FilteringRapper
示例。如果我的配置正确,它应该工作的方式是,所有消息都将记录到“Log.txt”,带有非空异常的消息将记录到“Honeypot.txt”。

请注意,如果您只需要异常,您的过滤器应该是:

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


我尝试了这个解决方案,但我不得不用单引号将${exception}括起来,如下所示:length(“${exception}”)。我已经提交了新版本供同行评审。条件是错误的,至少从4.5开始。如果条件的计算结果为false,则过滤器返回
FilterResult.Neutral
。任何不是
FilterResult.Ignore
FilterResult.IgnoreFinal
的内容默认为写入。与其检查它是否是异常,不如检查它是否是异常并忽略它。这就是Ymir的答案。