我的服务器上遇到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 私有_logger1作为ILogger 私有_logger为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("代理:" +会话(" agentNumber")。ToString()+"用户:" + Membership.GetUser() .UserName +"错误:bla bla例程doColumnConfiguration中的异常.SessionID =" + Session.SessionID,ex)
更新 - 配置修正。每次请求发布此消息。
ORIGINAL 的
从Apache的网站复制FIX
<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>
答案 0 :(得分:0)
错误代码对我来说非常明确:
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服务器的预期。试着调查一下。如果该参数应该被允许进入DB,请发布db schema
它看起来像一个SQL错误according to Microsoft
当您在4001和8000之间指定SqlParameter.Size的NVarChar参数时,SqlClient将抛出以下异常。
类型&#39; System.Data.SqlClient.SqlException&#39;的第一次机会异常发生在System.Data.dll中 来源:.Net SqlClient数据提供程序传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数(&#34; @&#34;):数据类型0xE7具有无效的数据长度或元数据长度。
根据相同的链接解决:
要解决此问题,请使用以下选项之一:
- 将Sqlparamter.size属性设置为-1,以确保从后端获取整个数据而不截断。
- 使用大小大于4000的String DbTypes时,显式将它们映射到另一个SqlDBType,如NText而不是使用 NVarchar(也是字符串的默认SqlDBType)。
- 对Sqlparameter.size使用不在4001和8000之间的值。