我遇到的问题是,我们的生产数据库偶尔会丢失记录。这是一个带有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>
也许我只需要分别记录这两件事并自己比较时间?我只是在寻找一个建议。
谢谢!
答案 0 :(得分:0)
您可以使用stacktrace
或stacktracedetail
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