mvc log4net将日志写入数据库失败解决之道——开启内部调试

时间:2022-03-05 16:55:41

项目信息:spring mvc5  EF6

数据库:sql2008r2

log4net版本:1.2.10.0

第一天:

1.思路一:配了半天,一直无法写入数据库,网上搜了一大堆的资料,都没能解决,怀疑是项目的框架问题。新建了一个空的项目实验,不用Nuget获取,直接引用log4net.dll,配置一番之后结果没有问题!可以写入,将其移植过来,又不行了!!

2.思路二:开启log4net内部调试,可一直不能成功开启。

  3.思路三:下载了log4net的源码加到项目中,调试发现问题所在,加进去以后发现调试一圈之后依然没有弹出任何错误,也没有发现加载数据库附着器。

  好了,一天结束了!!

第二天(雾霾非常严重的一天):

痛定思痛,还是要开启内部调试,网上相关开启内部调试的文章很少,只有两篇,按照其配置一直不能成功(其实他们写的没错,只是太简略了!),无奈之下想到到log4net官网中找寻答案——阅读官方网址:http://logging.apache.org/log4net/release/faq.html 中开启的方式,在web.config添加了:

节点一:

   <appSettings>

         <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

节点二:

<configuration>
... <system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics> ...
</configuration>

后即可调试。

调试中发现:在网上搜的ADONetAppender附着器中的数据执行命令有问题(改来改去的和我测试用的那个空项目的不一致了),如下:

有问题的命令:

  <commandText value="INSERT INTO SystemLog ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>

此节配置中, <commandText value="INSERT INTO SystemLog ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />命令的参数:@logger、@thread、@message和@exception与下面的参数名称不一致,在内部调试生成的文件中可以看到如下的提示信息:

log4net:ERROR [AdoNetAppender] Exception while writing to database
System.Data.SqlClient.SqlException (0x80131904): 必须声明标量变量 "@thread"。
无法预定义语句。

将其按照下面的参数名称改为一致后测试,即可。附上修改后的命令:

<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @log_thread, @log_level, @log_logger, @log_message, @log_exception)" />

总结:没能开启内部调试导致错误不能排查是这次配置的最大阻碍,一旦解决了这个问题,后来出现什么问题后就可以直接找到问题的根源,从而快速解决。

打完收工!!!!