0

我遇到了一个问题,即我们的生产数据库中偶尔会丢失记录。这是一个带有 nHibernate 的 .NET MVC 2 应用程序。在过去的几年里,几位开发人员一直在研究它,所以我们假设某个地方的映射设置不正确,并且 nHibernate 认为它应该删除这些记录。

我使用 log4net 从我们的管理员和前端(在单独的文件中)记录 nHibernate 生成的所有 SQL。奇怪的是,我们网站的前端似乎偶尔会为当时丢失的记录生成删除。这很奇怪,因为尽管前端和后端共享相同的数据模型,但前端不应该有任何写入/更新功能。我们确信这是所有 CRUD 所在的管理员中的一个错误。然而它在日志中......一批DELETES。

我想获得更多关于这些 SQL 语句是从堆栈中生成的位置的信息。如果我能在每个 nHibernate 事务之前以某种方式获得一个小的堆栈跟踪,那就太好了。到目前为止,我的 log4net 设置如下所示:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender,log4net" >

    <param name="File" value="nHibernate.txt" />
    <param name="AppendToFile" value="true" />
    <param name="DatePattern" value="yyyy.MM.dd" />

    <layout type="log4net.Layout.PatternLayout,log4net">
        <conversionPattern value="%d %p %m%n" />
    </layout>

</appender>

<logger name="NHibernate.SQL" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
</logger>

也许我只需要分别记录这两件事并自己比较时间?我只是在寻找建议。

谢谢!

4

1 回答 1

0

您可以使用stacktracestacktracedetail 转换模式

堆栈跟踪

用于输出日志事件的堆栈跟踪堆栈跟踪级别说明符可以用大括号括起来。例如,%stacktrace{level}。如果没有给出堆栈跟踪级别说明符,则假定为 1。输出使用格式:type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1。此模式不适用于 Compact Framework 程序集。

堆栈跟踪详细信息

用于输出日志事件的堆栈跟踪堆栈跟踪级别说明符可以用大括号括起来。例如,%stacktracedetail{level}。如果没有给出堆栈跟踪级别说明符,则假定为 1。输出使用格式:type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...)。此模式不适用于 Compact Framework 程序集。

你可以像这样使用它:

<conversionPattern value="%d %p %m%n%stacktrace" />

编辑:

关于 log4net 堆栈跟踪的几个 SO 问题:
如何在 log4net 中的每个日志调用中添加 StackTrace?
如何使用 log4net (C#) 记录堆栈跟踪 log4net
是否支持在日志消息中包含调用堆栈

于 2012-07-10T20:57:49.873 回答