Debugging log4net:错误[AdoNetAppender]错误代码:GenericFailure。写入数据库时发生异常
我的服务器上的Log4net出现问题。 仅供参考-Web开发服务器上安装了SQL。 我已经在我的本地开发机器上进行了编码和实现,它毫无问题地记录到我的本地数据库中。 我将所有代码和脚本部署到服务器环境中。不管出于什么原因,Log4net根本没有登录到SQL。 我重新配置了我的本地计算机以在开发服务器上使用SQL,并且它成功地记录了日志 当从服务器运行代码时,我能够附加并遍历代码,并且它执行log4net方法,没有任何异常。它从不写入数据库。 我启用了内部调试,发现的错误如下。但是我不知道是哪个部分产生了这个错误Debugging log4net:错误[AdoNetAppender]错误代码:GenericFailure。写入数据库时发生异常,debugging,log4net,internal,Debugging,Log4net,Internal,我的服务器上的Log4net出现问题。 仅供参考-Web开发服务器上安装了SQL。 我已经在我的本地开发机器上进行了编码和实现,它毫无问题地记录到我的本地数据库中。 我将所有代码和脚本部署到服务器环境中。不管出于什么原因,Log4net根本没有登录到SQL。 我重新配置了我的本地计算机以在开发服务器上使用SQL,并且它成功地记录了日志 当从服务器运行代码时,我能够附加并遍历代码,并且它执行log4net方法,没有任何异常。它从不写入数据库。 我启用了内部调试,发现的错误如下。但是我不知道是哪个部
log4net: Adding appender named [UserTrackingAppender] to logger [root].
log4net: Hierarchy Threshold []
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 5 ("@Error"): Data type 0xE7 has an invalid data length or metadata length.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 5 ("@Error"): Data type 0xE7 has an invalid data length or metadata length.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
表设计-我有两个不同的表,它们是为跟踪而设计的,另一个是为异常而设计的。
未选中ID int
未选中日期日期时间
未选中线程varchar(255)
[级别]varchar(50)未选中
未选中记录器varchar(255)
未选中消息varchar(4000)
已检查异常varchar(2000)
Log4NetLogger类
公共类Log4NetLogger
私人记录器1作为ILogger
作为ILog的专用记录器
Public Sub New()
_logger = LogManager.GetLogger(Me.[GetType]())
End Sub
Public Sub Info(message As String)
_logger.Info(message)
End Sub
Public Sub Warn(message As String)
_logger.Warn(message)
End Sub
Public Sub Debug(message As String)
_logger.Debug(message)
End Sub
Public Sub [Error](message As String)
_logger.[Error](message)
End Sub
Public Sub [Error](x As Exception)
[Error](LogUtility.BuildExceptionMessage(x))
End Sub
Public Sub [Error](message As String, x As Exception)
_logger.[Error](message, x)
End Sub
Public Sub Fatal(message As String)
_logger.Fatal(message)
End Sub
Public Sub Fatal(x As Exception)
Fatal(LogUtility.BuildExceptionMessage(x))
End Sub
End Class
我用来调用Info或Error的代码
_log4Net.Info(“用户-”+_userName+“”的成员资格有效。SessionID=“+Session.SessionID”)
_log4NetLogger.Error(“代理:”+会话(“代理编号”).ToString()+“用户:”+Membership.GetUser().UserName+“错误:doColumnConfiguration.SessionID=“+Session.SessionID,ex)”中的bla bla例程异常
更新-用于配置修复程序。根据SAMY的要求发布此邮件
原创
修复程序从Apache网站复制
<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>
****
我觉得错误代码非常明确:
System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS)
remote procedure call (RPC) protocol stream is incorrect. Parameter 5
("@Error"): Data type 0xE7 has an invalid data length or metadata length.
第五个参数不符合SQL server的预期。试着调查一下。如果参数应该被允许进入数据库,请发布数据库模式
它看起来像一个SQL错误 当使用SqlParameter.Size在4001和8000之间指定NVarChar参数时,SqlClient将引发以下异常。
System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的第一次意外异常 源:.Net SqlClient数据提供程序 传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数(“@”):数据类型0xE7的数据长度或元数据长度无效 根据相同链接的分辨率: 要解决此问题,请使用以下选项之一:
- 将SqlParameter.size属性设置为-1,以确保从后端获取整个数据而不进行截断
- 使用大小大于4000的字符串DBTYPE时,请将它们显式映射到另一个SqlDBType,如NText,而不是使用 NVarchar(也是字符串的默认SqlDBType)
- 对于Sqlparameter.size,请使用不介于4001和8000之间的值
@JerryFed我用在microsoft网站上找到的其他信息编辑了答案。谢谢你提供的所有信息,但是我并不完全同意,因为我可以在本地机器上运行代码时将数据插入服务器数据库。因此,有了这个概念,它应该会犯同样的错误。还有一件事,数据类型是varchar(4000)而不是nvarchar.UPDATE——我希望这能帮助其他人。此问题是列出参数顺序的配置文件。我知道这没有任何意义,因为它在我当地的开发环境中工作。首先,我将log4net分离到它自己的配置文件中。测试结果是零成功。在查看配置文件时,我注意到@error的参数位于配置文件的顶部,因此我决定重新构造它。我去了apache网站并复制了他们的配置。测试一下,现在一切都好了。谢谢你的参与。哇,真奇怪。。。您能否发布before/after配置文件,以便人们对不正确的配置有一些参考?恭喜你解决了这个问题。我在Samy.UPDATE后添加了配置-最终的解决方案是@ERROR被定义为5000而不是4000。男孩,我觉得自己很愚蠢。一直就在我面前,我错过了它。有时候rubberduck有点有用:)所以如果我理解正确,两台机器上的配置文件就是罪魁祸首。抢手货