如何在log4net ADONetAppender中使用存储过程?
时间:2020-03-06 14:41:09 来源:igfitidea点击:
我正在使用ADONetAppender通过存储过程来(尝试)记录数据(以便可以将逻辑注入到记录例程中)。
我的配置设置在下面列出。有人可以告诉我我在做什么错吗?
<appender name="ADONetAppender_SqlServer" type="log4net.Appender.ADONetAppender"> <bufferSize value="1" /> <threshold value="ALL"/> <param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <param name="ConnectionString" value="<MyConnectionString>" /> <param name="UseTransactions" value="False" /> <commandText value="dbo.LogDetail_via_Log4Net" /> <commandType value="StoredProcedure" /> <parameter> <parameterName value="@AppLogID"/> <dbType value="String"/> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{LoggingSessionId}" /> </layout> </parameter> <parameter> <parameterName value="@CreateUser"/> <dbType value="String"/> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{HttpUser}" /> </layout> </parameter> <parameter> <parameterName value="@Message"/> <dbType value="String"/> <size value="8000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@LogLevel"/> <dbType value="String"/> <size value="50"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> </appender>
解决方案
感谢警惕的DBA,我们已经解决了这个问题。
注意" @Message"参数的大小。 log4net正在猜测如何转换类型并将其转换为nvarchar(即使该列是varchar)。这很重要,因为nvarchar的最大大小为4000,而varchar的最大大小为8000。
DBA看到此知识库文章中所述的错误:http://support.microsoft.com/kb/827366
我将大小更改为4000,一切正常进行。
希望这可以帮助其他人避免同样的问题。
干杯!
</configSections> <log4net> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1"/> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <connectionString value="Data Source=yourservername;initial Catalog=Databasename;User ID=sa;Password=xyz;"/> <commandText value="INSERT INTO Log4Net ([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 ip=%property{ip}"/> </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>
使用" AnsiString"作为varchar的dbType。 nvarchar的"字符串"。
http://msdn.microsoft.com/zh-cn/library/system.data.dbtype%28v=VS.90%29.aspx