Похоже, что NLog записывает неверное значение в базу данных

#c# #logging #nlog #error-logging

#c# #ведение журнала #nlog #регистрация ошибок

Вопрос:

Я использую NLog для входа в базу данных. Мне кажется, что его значение неуместно в столбцах. Например, он записывает трассировку стека в столбец сообщений и информацию об исключении в столбец трассировки стека

Конфигурация:

 <nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwConfigExceptions="true" throwExceptions="true">
    <targets>
        <target name="database" type="Database" connectionString="Data Source=Server1;initial catalog=MyDb;Integrated Security=True;">
            <commandText>insert into dbo.AppException ([Level], Logger, Message, Exception, StackTrace) values (@Level, @Logger, @Message, @Exception, @StackTrace);</commandText>
            <parameter name="@Level" layout="${level}" />
            <parameter name="@Logger" layout="${logger}" />
            <parameter name="@Message" layout="${message}" />
            <parameter name="@Exception" layout="${exception}" />
            <parameter name="@StackTrace" layout="${stacktrace}" />
            <dbProvider>System.Data.SqlClient</dbProvider>
        </target>
    </targets>
    <rules>
        <logger name="*" minlevel="Error" writeTo="database" />
    </rules>
</nlog>
  

Мой тестовый код:

 throw new IOException("This is my message");
  

Код регистрации:

 logger.Error(ex);
  

Ниже приведен пример строки в базе данных

введите описание изображения здесь

На мой взгляд, значение в поле «Исключение» должно быть записано в столбце «Сообщение», а значение «StackTrace» должно быть записано в столбец «Исключение», и, наконец, значение «Сообщение» должно быть записано в «StackTrace».

Что-то не так в моей конфигурации или мои ожидания неверны?

Ответ №1:

Я предполагаю, что вы регистрируете исключение следующим образом:

 catch (Exception ex)
{
   _logger.Error(ex);  // ${message} will become ex.ToString(), since no message provided.
}
  

Если вместо этого вы изменили на это:

 catch (Exception ex)
{
   _logger.Error(ex, "Exception caught while testing");
}
  

И обновлено NLog.config до этого:

 <parameter name="@Exception" layout="${exception:format=tostring,data}" />
  

Тогда вы, вероятно, получите то, что хотите.

Комментарии:

1. 1 Спасибо за ответ. То, что вы предложили, не совсем то, что я ожидал, но ваш ответ привел меня к исправлению в моем nlog.config.

Ответ №2:

Прочитав ответ, опубликованный @Rolf, я обнаружил, что мои настройки nlog.config неверны. Настройка формата в nlog важна

Документ NLog

Я изменил свой nlog на ниже, и он работал, как ожидалось

 <parameter name="@Message" layout="${exception:format=message}" />
<parameter name="@Exception" layout="${exception:format=type}" />
<parameter name="@StackTrace" layout="${exception:format=stacktrace}" />
  

введите описание изображения здесь