log4net:错误[AdoNetAppender] ErrorCode:GenericFailure。写入数据库时​​出现异常

时间:2014-03-26 14:43:22

标签: 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         私有_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>

1 个答案:

答案 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之间的值。
  •