#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 на ниже, и он работал, как ожидалось
<parameter name="@Message" layout="${exception:format=message}" />
<parameter name="@Exception" layout="${exception:format=type}" />
<parameter name="@StackTrace" layout="${exception:format=stacktrace}" />