nHibernate SQL日志记录+堆栈跟踪在一起

时间:2012-07-10 20:47:56

标签: sql asp.net-mvc nhibernate log4net missing-data

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

我使用log4net从我们的管理员和前端(在单独的文件中)记录nHibernate生成的所有SQL。奇怪的是,我们网站的前端似乎偶尔会为当时丢失的记录生成DELETES。这很奇怪,因为虽然前端和后端共享相同的数据模型,但前端不应具有任何写/更新功能。我们确信这是管理员中所有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>

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

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用stacktracestacktracedetail conversion patterns

<强>栈跟踪

  

用于输出日志记录事件的堆栈跟踪堆栈跟踪   级别说明符可以括在大括号之间。例如,   %栈跟踪{水平}。如果没有给出堆栈跟踪级别说明符,则为1   假设。   输出使用格式:type3.MethodCall3&gt; type2.MethodCall2&gt;   type1.MethodCall1。   此模式不适用于Compact Framework程序集。

<强> stacktracedetail

  

用于输出日志记录事件的堆栈跟踪堆栈跟踪   级别说明符可以括在大括号之间。例如,   %stacktracedetail {水平}。如果没有给出堆栈跟踪级别说明符   假设为1。输出使用格式:type3.MethodCall3(类型   param,...)&gt; type2.MethodCall2(type param,...)&gt;   type1.MethodCall1(类型param,...)。此模式不可用   紧凑框架组件。

您可以像这样使用它:

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

修改

关于log4net堆栈跟踪的问题很少:
How do you add a StackTrace to every log call in log4net?
How to log stack trace using log4net (C#)
Does log4net support including the call stack in a log message