Debugging log4net:错误[AdoNetAppender]错误代码:GenericFailure。写入数据库时发生异常

Debugging log4net:错误[AdoNetAppender]错误代码:GenericFailure。写入数据库时发生异常,debugging,log4net,internal,Debugging,Log4net,Internal,我的服务器上的Log4net出现问题。 仅供参考-Web开发服务器上安装了SQL。 我已经在我的本地开发机器上进行了编码和实现,它毫无问题地记录到我的本地数据库中。 我将所有代码和脚本部署到服务器环境中。不管出于什么原因,Log4net根本没有登录到SQL。 我重新配置了我的本地计算机以在开发服务器上使用SQL,并且它成功地记录了日志 当从服务器运行代码时,我能够附加并遍历代码,并且它执行log4net方法,没有任何异常。它从不写入数据库。 我启用了内部调试,发现的错误如下。但是我不知道是哪个部

我的服务器上的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有点有用:)所以如果我理解正确,两台机器上的配置文件就是罪魁祸首。抢手货