【问题标题】:log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to databaselog4net:错误 [AdoNetAppender] 错误代码:GenericFailure。写入数据库时​​出现异常
【发布时间】:2014-05-05 01:27:21
【问题描述】:

我的服务器上的 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("Agent:" + Session("agentNumber").ToString() +" User:" + Membership.GetUser().UserName +" 错误: bla bla 例程 doColumnConfiguration 中的异常。SessionID = " + Session.SessionID,例如)

更新 - 用于配置修复。根据 Samy 要求发布此内容。

原创

FIX复制自 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>

【问题讨论】:

  • 更新 - 我希望这对其他人有帮助。此问题是列出参数顺序的配置文件。我知道这没有任何意义,因为它在我的本地开发环境中工作。首先,我将 log4net 分离到它自己的配置文件中。测试它的成功率为零。在查看配置文件时,我注意到 @error 的参数位于配置的顶部,因此我决定对其进行重构。我去了apache网站并复制他们的配置。测试它,现在一切都很好。感谢您的参与。
  • 哇,这真的很奇怪...您能否发布之前/之后的配置文件,以便人们对不正确的配置有一些参考?恭喜你解决了这个问题
  • 我将配置添加到了 Samy 的帖子中。
  • 更新 - 最终的解决方案是 @ERROR 被定义为 5000 而不是 4000。男孩我觉得很愚蠢。一直在我面前,我错过了。
  • 有时有点橡皮鸭很有用:) 所以如果我理解正确的话,两台机器上的配置文件就是罪魁祸首。不错的收获

标签: debugging log4net internal


【解决方案1】:

错误代码对我来说看起来很明确:

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 服务器的预期。试着调查一下。如果参数应该被允许进入数据库,请发布数据库架构


它看起来像一个 SQL 错误according to Microsoft

当你指定一个SqlParameter.Size在4001到8000之间的NVarChar参数时,SqlClient会抛出如下异常。
System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的第一次机会异常 来源:.Net SqlClient 数据提供者

传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数(“@”):数据类型 0xE7 的数据长度或元数据长度无效。

根据同一链接解决:

要解决此问题,请使用以下选项之一:

  • 将 Sqlparamter.size 属性设置为 -1 以确保您从后端获取整个数据而不会被截断。
  • 使用大小大于 4000 的字符串 DbType 时,将它们显式映射到另一个 SqlDBType,如 NText,而不是使用 NVarchar(这也是字符串的默认 SqlDBType)。
  • 为 Sqlparameter.size 使用一个不介于 4001 和 8000 之间的值。

【讨论】:

  • @JerryFed 我用我在微软网站上找到的其他信息编辑了答案
  • Samy 感谢所有信息,但我并不完全同意,因为当我从本地计算机运行代码时,我可以将数据插入服务器数据库。所以有了这个概念,它应该会出错。数据类型的另一件事是 varchar(4000) 而不是 nvarchar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2013-01-19
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多