【发布时间】: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