【问题标题】:How to force nlog to throw an exception when the logging to database fails?当记录到数据库失败时如何强制nlog抛出异常?
【发布时间】:2021-09-16 09:47:15
【问题描述】:

当我关闭支持 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>

【问题讨论】:

    标签: nlog


    【解决方案1】:

    你可以通过following强制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 将它自己的异常记录到指定的文件中。

    【讨论】:

      【解决方案2】:
      1. NLog.config 是否将属性“复制到输出目录”设置为“始终复制”?
      2. 我认为您的 NLog.config 文件有误:您在目标 (documentation) 中使用元素而不是属性。应该是这样的:
      <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>
      

      【讨论】:

      • 1) 它没有,但它起作用了……尽管我现在将它设置为始终复制,但还是很感谢。 2)日志记录实际上工作正常,但我的问题是,如果我关闭 SQL 服务器,NLog 将不会抛出任何异常或记录它未能登录到数据库的任何地方。我希望能够捕捉和处理 NLog 的异常。
      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 2017-02-19
      • 2016-02-14
      • 2016-12-15
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多