How to get the Stack trace when logging exceptions with NLog?

限于喜欢 提交于 2019-11-28 16:58:35

问题


When I use the default layout with NLog it only prints the name of the exception. I've been told that the log4jxmlevent layout doesn't prints nothing about the exception. What layout will help me?

Example code:

try
{
    throw new SystemException();
}
catch (Exception ex)
{
    logger.Error("oi", ex);
}

Default layout output:

2011-01-14 09:14:48.0343|ERROR|ConsoleApplication.Program|oi

log4jxmlevent output:

<log4j:event logger="ConsoleApplication.Program"
           level="ERROR"
           timestamp="1295003776872"
           thread="9">
<log4j:message>oi</log4j:message>
<log4j:NDC />
<log4j:locationInfo class="ConsoleApplication.Program"
                    method="Void Main(System.String[])"
                    file="C:\Users\User\Documents\Visual Studio 2010\Projects\ConsoleApplication\ConsoleApplication\Program.cs"
                    line="21" />
<nlog:eventSequenceNumber>3</nlog:eventSequenceNumber>
<nlog:locationInfo assembly="ConsoleApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<log4j:properties>
  <log4j:data name="log4japp"
              value="true" />
  <log4j:data name="log4jmachinename"
              value="MACHINE" />
</log4j:properties>


回答1:


I had to use the one of the Logger. + Level + Exception methods:

logger.ErrorException("ex", ex);

and a custom layout

layout="${exception:format=ToString,StackTrace}${newline}"



回答2:


Use the overloads that take an Exception as the second argument:

catch(Exception crap)
{
    log.Error("Something went horribly wrong.", crap);
}

Then in your layout include the ${exception} layout renderer:

<target ...
    layout="${longdate} ${message} ${exception:format=ToString}" />

Sources:

  • https://github.com/NLog/NLog/wiki/How-to-Log-Exceptions
  • https://github.com/nlog/NLog/wiki/Exception-Layout-Renderer



回答3:


As documented in How to Log Exceptions, starting with NLog 4.0, pass the exception as the first parameter to Error, for example like this:

logger.Error(ex, "Nickers!");

In the NLog configuration (e.g. in web.config or app.config), include ${exception:format=tostring} in the layout, for example like this:

<target name="f" type="File" layout="${longdate} ${message} ${exception:format=tostring}"/> 



回答4:


As of NLog 4.5 you can now use:

logger.Error(exception, message);

and layout as follows:

"${longdate} ${level} ${message} ${exception:format=@}"

The @ means serialize all Exception-properties into Json-format



来源:https://stackoverflow.com/questions/4684399/how-to-get-the-stack-trace-when-logging-exceptions-with-nlog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!