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

.NetExceptionStack TraceNlog

.Net Problem Overview


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>

.Net Solutions


Solution 1 - .Net

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}"

Solution 2 - .Net

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

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

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

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

Sources:

Solution 3 - .Net

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}"/> 

Solution 4 - .Net

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJader DiasView Question on Stackoverflow
Solution 1 - .NetJader DiasView Answer on Stackoverflow
Solution 2 - .NetClayView Answer on Stackoverflow
Solution 3 - .NetEdward BreyView Answer on Stackoverflow
Solution 4 - .NetMichael ArmitageView Answer on Stackoverflow