如何在记录到数据库失败时强制nlog抛出异常?

时间:2012-02-07 20:55:00

标签: nlog

当我取消支持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 个答案:

答案 0 :(得分:15)

您可以通过以下

强制Nlog在未访问sql server时抛出异常
<nlog throwExceptions="true">
 ... your nlog config
</nlog>

此处有更多信息,

http://nlog-project.org/2010/09/05/new-exception-handling-rules-in-nlog-2-0.html

这是v2.0中的一项新功能,因此您需要v2.0。

它不适用于早期版本。

还要检查以下配置信息

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

允许Nlog将自己的异常记录到指定文件中。

答案 1 :(得分:2)

  1. NLog.config是否将“复制到输出目录”属性设置为“始终复制”?
  2. 我认为你有错误的NLog.config文件:你在目标(documentation)中使用元素而不是属性。应该是这样的:

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