如果异常不为null,则Nlog输出字符

时间:2015-12-07 17:01:11

标签: c# asp.net nlog

如果Exception不为null,Nlog中是否存在输出特定字符的方法。例如我的布局是:

layout="${longdate}|${callsite:skipFrames=1}|${message}|${exception:format=tostring}" 

如果我拨打NLog.Debug("Hello"),输出将为:

2015-12-07 11:50:00.5114|MyDll.MyClass.MyMethod|Hello|

正在打印出最后一个字符|。有没有办法防止这种情况,只有在打印出实际异常时才打印出来?

5 个答案:

答案 0 :(得分:6)

另请查看“何时”布局渲染器

${when:when=Condition:inner=Layout} 

OP编辑,为未来的访问者展示工作解决方案:

layout="${longdate}|${callsite:skipFrames=1}|${message}${when:when=length('${exception}')>0:Inner=|}${exception:format=tostring}"

答案 1 :(得分:4)

您可以使用${onexception:INNER}布局渲染器。

${message}${onexception:|${exception:format=Type,Message,StackTrace,Data}}

如果有异常,它会添加一个'|'然后是您指定的任何异常格式。如果不存在任何异常,则仅呈现$ {message}。

答案 2 :(得分:2)

我一直在使用exceptionSeparator的{​​{1}}参数,只有在出现异常时才会输出。例如。在消息之间给出一个空格:

$(message)

答案 3 :(得分:1)

您可以定义一个目标,该目标显式测试异常是否为空:

<target name="fileAsException"
        xsi:type="FilteringWrapper"
        condition="length('${exception}')>0">
  <target xsi:type="File"
          fileName="c:\my path\exceptions.log"
          layout="${ExceptionVerboseLayout}" />
</target>

(参见“condition =”length('$ {exception}')&gt; 0“&gt;”行)
您可以使用特定布局绑定它(在我的示例中为“ExceptionVerboseLayout”)。

答案 4 :(得分:1)

我将结合以上两个答案

  • 使用when布局呈现类似@skalinkin的答案,但我认为首选的使用异常消息来检测是否为null的异常,就像这样
layout="${longdate}|${message}${when:when=length('${exception:format=tostring}')>0:Inner=|}${exception:format=tostring}"
  • 使用onexception布局呈现类似@Alex的答案
layout="${longdate}|${message}${onexception:inner=|Exception\: ${exception:format=tostring}}"

有关建议的布局的更多详细信息,请点击此处官方文档

我更喜欢使用第二个“建议”