Configuring NHibernate logging
NHibernate 日志配置
NHibernate使用log4net来记录日志, log4net是一个高度可定制的而且是开源的日志框架.本节介绍如何通过log4net的简单配置去实现NHibernate的事件记录,并将这些信息输出到Visual Studio的调试窗口.
准备
完成前面Configuring NHibernate with App.config小节的示例.
步骤
1. 为项目添加log4net.dll引用,NHibernate下载包中包含该文件.
2. 打开应用程序配置文件.
3. 在configSections元素中为log4net配置定义一个section :
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
4. 在hibernate配置元素后, 添加下面的log4net配置:
<log4net> <appender name="trace" type="log4net.Appender.TraceAppender, log4net"> <layout type="log4net.Layout.PatternLayout, log4net"> <param name="ConversionPattern" value=" %date %level %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="trace" /> </root> <logger name="NHibernate"> <level value="INFO" /> </logger> </log4net>
5. 在Main函数的开头插入log4net的配置代码:
log4net.Config.XmlConfigurator.Configure();
6. 编译运行.
7. 查看Visual Studio的调试输出窗口.
原理
log4net使用appenders, layouts和loggers来格式化和控制应用程序(包括NHibernate)的日志信息.
Appenders定义了日志信息写入到何处. 这个示例中, 我们已经定义了一个跟踪appender, 她将日志信息输出到了 System.Diagnostics.Trace. 当我们调试程序的时, Visual Studio会监听调试并将每一个调试信息都输出到调试输出窗口.
Loggers是日志消息的消息源. 使用根元素可以为所有的loggers定义值,但是使用logger元素可以覆盖根元素的定义. 在我们的配置中, 已经定义了所有的消息都应该被写入到名为trace的appender中.
在log4net中, 日志消息是有优先级的. 按升序排列的话, 她们是DEBUG, INFO, WARN, ERROR,和FATAL.在我们的配置中,我们可以使用她们中的一个来定义日志记录级别, 或者使用 ALL或OFF .某一级别包含她本身和比她更高的所有级别.例如, WARN级别也会包含ERROR和FATAL消息. ALL级别等价于 DEBUG:所有的消息都会被记录 all ,OFF则会禁用所有日志记录.
使用我们的配置, log4net会记录的消息:来自NHibernate的INFO, WARN, ERROR,和FATAL,和其他来源的所有信息.
扩展
可以讲log4net应用到我们自己的应用程序中. 如下例所示:
using System.IO; using log4net; namespace MyApp.Project.SomeNamespace { public class Foo { private static ILog log = LogManager.GetLogger(typeof(Foo)); public string DoSomething() { log.Debug("We're doing something."); try { return File.ReadAllText("cheese.txt"); } catch (FileNotFoundException) { log.Error("Somebody moved my cheese.txt"); throw; } } } }
我们定义了一个很简单的类,名为Foo. 在DoSomething()方法中,使用DEBUG写入了"We're doing something."这个日子消息.然后我们返回了cheese.txt文件的内容. 如果该文件不存在, 会记录一个error日志信息并跑出异常.
因为我们通过typeof(Foo)来得到logger, Foo的logger名为MyApp.Project.SomeNamespace.Foo, 和本身的类型相同the same as the type. 这是使用log4net时的命名约定.
假使我们不想再关心来自Foo的debug级别的消息, 而想需要知道warnings和errors级别的消息.,那我们通过添加下述的配置来重定义日志记录级别:
<logger name="MyApp.Project.SomeNamespace.Foo"> <level value="WARN" /> </logger>
或者, 我们也可以使用下述代码来为整个命名空间或是整个项目设置日志记录级别.
<logger name="MyApp.Project"> <level value="WARN" /> </logger>
使用log4net排查NHibernate
如果将NHibernate的show_sql属性设置为了true, NHibernate会将所有SQL语句输出到Console.Out.在某些情况下这么做是挺方便的, 但是许多应用程序并不使用控制台来输出日志消息. 使用log4net,我们可以将SQL语句写入到trace中.
NHibernate也会将每个SQL语句写入到一个名为NHibernate.SQL的记录器(logger)中 . 这些日志消息属于DEBUG级别. 我们也可以通过在配置中添加下述代码来为指定的logger重定义日志记录级别. 我们将会在跟踪输出中得到所有的SQL语句.
<logger name="NHibernate.SQL"> <level name="DEBUG" /> </logger>