几乎所有的程序都需要日志记录功能。目前为止,已经存在很多提供日志记录功能的框架,我们没必要自己实现,只需要使用它们中的一个即可。.NET中最知名和成熟的日志记录框架是Log4Net。这是一个开源框架,由NHibernate使用。
为程序添加日志记录
在这个小练习中,我们将创建一个实例程序并配置其使用Log4Net日志记录框架,然后创建一些基本的日志记录信息。
1. 打开Visual Studio,创建一个控制台应用程序:LoggingSample。
2. 添加对log4net.dll程序集的引用。
3. 右击LoggingSample项目,选择属性,在Application选项卡中,设置Target framework为.NET Framework 4。
4. 为项目添加一个配置文件App.config,如果已经存在了,就不用添加了。在配置文件中配置应用程序通过定义log4net节使用Log4Net,代码如下:
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%C.%M] %-5p %m%n"/> </layout> </appender> <root> <level value="DEBUG"/> <appender-ref ref="ConsoleAppender"/> </root> </log4net> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
上面的代码中定义了一个log4net节。conversionPattern描述日志输出应如何格式化,appender是告诉Log4Net应该使用哪个appender,level是定义我们想启用的输出级别。该级别从低到高是DEBUG<INFO<WARN<ERROR<FATALNONE。
5. 在Program类中,为该类文件添加XmlConfigurator特性,注意添加到命名空间上面:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
7. 在Program类中,添加并初始化一个类型为ILog的静态类级别变量,如下面的代码所示:
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
8. 使用logger产生一些不同级别的的日志信息。代码如下:
static void Main(string[] args) { log.Debug("This is a Debug message."); log.Info("This is a Info message."); log.Warn("This is a Warn message."); log.Error("This is a Error message."); log.Fatal("This is a Fatal message."); Console.Write("\r\nHit enter to exit:"); Console.ReadLine(); }
9. 运行程序,结果如下图所示:
10. 在App.config中,修改日志记录级别为WARN,再次运行程序,如下图所示:
在NHibernate中启用日志记录
如前面所述,NHibernate使用Log4Net生成日志信息。现在我们已经对Log4Net的相关知识有了一定理解以及如何配置它们,根据程序需求我们可以使用这些知识为NHibernate设置日志记录。
1. 打开上一篇的OrderingSystem解决方案。
2. 在OrderingSystem.Tests中添加对log4net.dll的引用。
3. 为OrderingSystem.Tests添加一个App.config配置文件,代码如下所示:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net debug="false"> <appender name="console" type="log4net.Appender.ConsoleAppender, log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="console" /> </root> </log4net> </configuration>
4. 打开entity_mapping_specs类,添加代码为单元测试初始化日志记录,如下所示:
protected override void BeforeAllTests() { base.BeforeAllTests(); log4net.Config.XmlConfigurator.Configure(); }
5. 运行测试,结果如下图所示:
6. 这是全部的信息,但是我们想减少它。NHibernate定义了两个logger:NHibernate和NHibernate.SQL。我们可以分别配置这两个logger。在App.config文件中<root>标签前边添加如下代码:
<logger name="NHibernate"> <level value="WARN"/> </logger> <logger name="NHibernate.SQL"> <level value="ALL"/> </logger>
7. 修改之后,再次运行测试,结果如下图所示: