Как заставить nlog генерировать исключение при сбое входа в базу данных? - PullRequest
13 голосов
/ 08 февраля 2012

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

Вот как выглядит моя конфигурация:

<?xml version="1.0" ?>
<nlog autoReload="true" throwExceptions="true" internalLogFile="${basedir}/App_Data/nlog.txt" internalLogLevel="Debug"
 internalLogToConsole="true">

 <targets>
 <!--Useful for debugging-->
 <target name="consolelog" type="ColoredConsole"
 layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}" />



 <target name="databaselog" type="Database">

 <dbProvider>System.Data.SqlClient</dbProvider>

 <!-- database connection parameters -->
 <!-- alternatively you could provide a single 'connectionstring' parameter -->
 <connectionString>Data Source=.\SQLEXPRESSZ;Initial Catalog=aspnetdb;Integrated Security=SSPI</connectionString>

 <commandText>
 insert into NLog_Error ([time_stamp],[level],[host],[type],[source],[logger],[message],[stacktrace],[allxml]) values(@time_stamp,@level,@host,@type,@source,@logger,@message,@stacktrace,@allxml);
 </commandText>

 <parameter name="@time_stamp" layout="${utc_date}" />
 <parameter name="@level" layout="${level}" />
 <parameter name="@host" layout="${machinename}" />
 <parameter name="@type" layout="${exception:format=type}" />
 <parameter name="@source" layout="${callsite:className=true:fileName=false:includeSourcePath=false:methodName=false}" />
 <parameter name="@logger" layout="${logger}" />
 <parameter name="@message" layout="${message}" />
 <parameter name="@stacktrace" layout="${exception:stacktrace}" />
 <parameter name="@allxml" layout="${web_variables}" />

 </target>

 </targets>

 <rules>

 <logger name="*" minlevel="Info" writeTo="databaselog" />
 </rules>

</nlog>

Ответы [ 2 ]

16 голосов
/ 25 мая 2012

Вы можете заставить Nlog выдавать исключение, если сервер sql не доступен, выполнив

<nlog throwExceptions="true">
 ... your nlog config
</nlog>

Больше информации здесь,

http://nlog -project.org / 2010/09/05 / New-обработки исключений-правила-в-Nlog-2-0.html

Это новая функция в версии 2.0, поэтому вам нужна версия 2.0.

Это не будет работать в более ранних версиях.

Также проверьте следующую информацию о конфигурации

https://github.com/NLog/NLog/wiki/Logging-Troubleshooting

, который позволяет Nlog регистрировать свои собственные исключения в указанном файле.

2 голосов
/ 08 февраля 2012
  1. Имеет ли NLog.config свойство "Копировать в выходной каталог", установленное как "Копировать всегда"?
  2. Я думаю, что у вас неправильный файл NLog.config: вы используете элементы вместо атрибутов внутрицель ( документация ).Должно быть что-то вроде этого:

<target 
  name="databaselog" 
  type="Database"
  dbProvider="System.Data.SqlClient"
  connectionString="Data Source=.\SQLEXPRESSZ;Initial Catalog=aspnetdb;Integrated Security=SSPI"
  commandText="insert into NLog_Error ([time_stamp],[level],[host],[type],[source],[logger],[message],[stacktrace],[allxml]) values(@time_stamp,@level,@host,@type,@source,@logger,@message,@stacktrace,@allxml);">
    <parameter name="@time_stamp" layout="${utc_date}" />
    <parameter name="@level" layout="${level}" />
    <parameter name="@host" layout="${machinename}" />
    <parameter name="@type" layout="${exception:format=type}" />
    <parameter name="@source" layout="${callsite:className=true:fileName=false:includeSourcePath=false:methodName=false}" />
    <parameter name="@logger" layout="${logger}" />
    <parameter name="@message" layout="${message}" />
    <parameter name="@stacktrace" layout="${exception:stacktrace}" />
    <parameter name="@allxml" layout="${web_variables}" />
</target>
...