Как получить трассировку стека при регистрации исключений с помощью NLog? - PullRequest
50 голосов
/ 13 января 2011

Когда я использую макет по умолчанию с NLog, он печатает только имя исключения.Мне сказали, что макет log4jxmlevent не печатает ничего об исключении.Какой макет мне поможет?

Пример кода:

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

Вывод макета по умолчанию:

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

log4jxmlevent вывод:

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

Ответы [ 4 ]

89 голосов
/ 14 января 2011

Мне пришлось использовать один из методов Logger. + Level + Exception:

logger.ErrorException("ex", ex);

и пользовательский макет

layout="${exception:format=ToString,StackTrace}${newline}"
17 голосов
/ 01 января 2015

Используйте перегрузки, которые принимают исключение в качестве второго аргумента:

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

Затем в ваш макет включите ${exception} средство визуализации макета:

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

Источники:

14 голосов
/ 01 июля 2015

Как описано в Как регистрировать исключения , начиная с NLog 4.0, передать исключение в качестве первого параметра в Error, например, так:

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

В конфигурации NLog (например, в web.config или app.config), включите ${exception:format=tostring} в макет, например, так:

<target name="f" type="File" layout="${longdate} ${message} ${exception:format=tostring}"/> 
1 голос
/ 09 января 2019

Начиная с NLog 4.5, теперь вы можете использовать:

logger.Error(exception, message);

и расположение следующим образом:

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

@ означает сериализацию всех Exception-свойств в формат Json

...