翻译

原文地址:http://www.devx.com/dotnet/Article/36184/0/page/1 
原文作者:Thiru Thangarathinam (好强大的名字)
翻译: flanker

简介

日志程序块提供了灵活的可扩展的日志机制,你可以在任何类型的.NET程序中使用它——包括WinForms、ASP.NET、控制台程序等。它提供一些可重用的日志类(也称为监控器),可以把日志信息记录在多种载体上,包括数据库、XML文件、普通文件、事件记录等。

作为开发者,你仅需选择一个监控器并且在应用程序配置文件中指明它,就可以在程序中调用基本的日志功能了。

安装完Enterprise Library 3.1后,你可以在<你的目录>/Microsoft Enterprise Library 3.1-May 2007/Bin文件夹中看到一些程序集。

使用基本的日志功能,你需要添加对Microsoft.Practices.EnterpriseLibrary.Common.dll和
Microsoft.Practices.EnterpriseLibrary.Logging.dll的引用。如果打算把信息记录在数据库中,那还需要
添加对Microsoft.Practices.EnterpriseLibrary.Data.dll的引用。图片一表示了日志程序块的依赖关系。


图片一 日志程序块的依赖关系。

建立一个简单示例

这是一个简单示例,演示了如何配置日志程序块来把日志保存到事件记录中。首先建立一个C# Windows应用程序,命名为LoggingBlockExample,如上面所说地添加程序集引用。

然后,导入如下的日志命名空间:

using Microsoft.Practices.EnterpriseLibrary.Logging;

接下来,在应用程序配置文件(app.config)中添加配置选项,来指明日志将保存在事件记录中(见列表1)。所有配置都在<loggingConfiguration> 节点中,如下四个:

listeners —— 指明监控器,来记录日志。
formatters —— 可选元素,用来指明日志的格式。
categorySources —— 负责建立特定的日志分类和监控器的对应关系。注意,必须要给<loggingConfiguration>元素的defaultCategory属性指明一个categorySources。
specialSources —— 指明特殊的监控对象来处理特殊的日志条目。

搞定app.config后,下一步就是用日志程序块来写代码了。首先,在Windows窗体添加一个叫做btnLogMessage的按钮,对按钮添加Click事件处理如下:

   private void btnLogMessage_Click(object sender, EventArgs e)
   {
     //建立一个LogEntry对象,并设置它的属性
     LogEntry entry = new LogEntry();
     entry.EventId = 1;
     entry.Priority = 1;
     entry.Message = "This is a test message";
     entry.Categories.Clear();
     //注意默认的分类是General
     entry.Categories.Add("General");
     Logger.Write(entry);
     MessageBox.Show("Log is written");
   }

上面的代码使用了两个日志类:LogEntry和Logger。LogEntry表示一个日志条目,所以它提供一些属性——优先级、事件ID、日志消息等。Logger提供类方法来把日志消息写入在配置文件中指明的一个或者多个监控器里。

所以,要写一个日志消息,你应该建立一个LogEntry对象并对其属性赋值。LogEntry对象可以添加一个或者多个分类,以便让适合的监控器记录。

图片二表示了在示例程序中点击“记录日志”按钮后,日志消息被保存在事件记录中。


图片二 事件记录:通过Windows事件查看器的应用程序分类来查看纪录的日志消息。

使用Enterprise Library配置工具

虽然可以手工的修改app.config文件,但是使用Enterprise Library自带的配置工具将会更加简单。

打开Enterprise Library配置工具,建立一个新的应用程序,在Application Configuration上右击选择New → Logging Application Block。(见图片三)


图片三:Enterprise Library配置工具:这个工具使用一个向导来配置日志。

日志程序块的配置包含四个元素:Category Sources、Special Sources、Trace
Listeners、和Formatters。默认情况下,配置工具建立一个使用Text Formatter作为默认格式的Formatted
EventLog TraceListener监控器,并在Category Sources中已经添加了它。

下面讲如何通过配置工具来设置一个XML文件日志。首先要建立一个XML监控器,右击Trace Listeners节点选择New → XML Trace Listener,建立了监控器后,把右边面板的name属性改为C:/Temp/Trace.xml。

下一步是引用新的监控器,右击All Events节点选择New → Trace Listener
Reference。添加监控器引用后,把右边面板的ReferencedTraceListener属性改为XML Trace
Listener。当你完成这些时,结果应该和图片四类似。


图片四 把日志导向XML监控器:通过在All Events中引用XML监控器,你可以把日志的任何事件保存在XML文件中。

把配置工具的设置保存为app.config。现在你在C#示例项目中使用新生成的app.config,日志数据将会记录在XML日志文件中。(见图片五)


图片五 XML日志:这是一个日志记录的XML文件。注意这里有两个主要节点(System和ApplicationData)分别保存系统属性和日志。

使用数据库作为日志存储

你已经知道了如何在事件记录和XML文件中写日志了,这适合大多数的简单应用,但对更复杂的应用程序,你也许想把日志记录在一个稳定的存储中比如
SQL Server数据库。日志在数据库中也可以更方便的查询。日志程序块提供一个数据库监控器,可以实现纪录日志到数据库中。

要使用数据库日志,你首先要执行一段SQL脚本(由Enterprise
Library提供)来建立数据库。运行<你的目录>/EntLib3Src/AppBlocks/Src/Logging
/TraceListeners/Database/Scripts文件夹中的LoggingDatabase.sql文件,它会在你的SQL
Server中建立一个名为Logging的数据库。

现在,需要修改app.config文件来使用数据库监控器。你也要指明数据库连接字符串。代码中的Database App.config文件是一个完整的配置文件。

原文作者注:在使用app.config文件前,确保你已经把Database App.config文件里的<connectionStrings>元素连接字符串改为匹配你自己的数据库。

接下来,打开之前的WinForms应用程序,替换app.config文件,再次运行程序。这次点击按钮后,你就可以在Logging数据库的Log表里查看到日志条目了。

实现自定义的监控器

如果内置的监控器不能满足你的要求,日志程序块允许你来实现自定义的监控器,自定义监控器继承自CustomTraceListener类。但这些已经超出这篇文章的范围,你可以在这篇MSDN文章上获取更多信息。

你已经了解如何使用日志程序块来让你在.NET程序中建立灵活易于维护的日志系统。使用配置文件和简单代码在文件、事件记录和数据库中记录日志。当
然,配置文件是有一点儿烦人,但这总比写重复的代码甚至为了转换存储而必须要改变代码要来的好。而且,Enterprise
Library配置工具将会通过向导来简化配置工作。现在,你可以在你的应用程序中添加很棒的日志了。

关于作者

Thiru Thangarathinam
在亚利桑那州Intel公司工作。他是微软的MVP,擅长使用.NET相关技术来构架、设计和开发分布式企业级应用。他是《Professional
ASP.NET 2.0 XML》和《Professional ASP.NET 2.0
Databases》的作者,并且参与写作了一系列的.NET相关技术的书籍。他也是一个在线技术出版物的积极贡献者。Email联系

Microsoft.Practices.EnterpriseLibrary.Logging的使用的更多相关文章

  1. VS - Microsoft.Practices.EnterpriseLibrary.Logging

    string fileName = AppDomain.CurrentDomain.BaseDirectory + "\\log.txt";File.AppendAllText(f ...

  2. Microsoft.Practices.EnterpriseLibrary企业库问题

    System.Configuration.ConfigurationErrorsException: Invalid TraceListenerData type in configuration ' ...

  3. Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, ...

    使用oracle数据库一个多月依赖这问题一直都得不到解决,最近任务不是很忙了,所以决定把这问题解决掉.写一篇文章做记录. 以上错误主要是net程序oracle数据库使用了Microsoft Enter ...

  4. Microsoft.Practices.EnterpriseLibrary

    项目中使用了Microsoft.Practices.EnterpriseLibrary这个东西,根据名字猜测和微软有关系(可以翻译为:微软实践企业库). 看到了引入了两个命名空间: using Mic ...

  5. 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存

    返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...

  6. 错误:创建 cachingConfiguration 的配置节处理程序时出错: 未能加载文件或程序集“Microsoft.Practices.EnterpriseLibrary.Caching,

    问题: 错误:创建 cachingConfiguration 的配置节处理程序时出错: 未能加载文件或程序集“Microsoft.Practices.EnterpriseLibrary.Caching ...

  7. c# 之 Microsoft.Practices.EnterpriseLibrary连接Oracle

    首先下载Microsoft Enterprise Library 5.0:http://www.microsoft.com/en-us/download/details.aspx?id=15104,这 ...

  8. 在WebService中使用Microsoft.Practices.EnterpriseLibrary.Data配置数据库

    1. 新建WebApplication1项目 1.1 新建—Web—ASP.NET Empty Web Application--WebApplication1 1.2 添加一个WebForm1 2. ...

  9. 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)

    返回目录 概念 Microsoft.Practices.Unity.Interception是一个拦截器,它隶属于Microsoft.Practices.Unity组成之中,主要完成AOP的功能,而实 ...

随机推荐

  1. javascript --学习闭包,自由变量

    闭包 下面是百度百科的解释: 闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量). 也就是说一个代码块 ...

  2. Python requests模块

    import requests 下面就可以使用神奇的requests模块了! 1.向网页发送数据 >>> payload = {'key1': 'value1', 'key2': [ ...

  3. 在 SUSE 11 sp2 上安装 freeradius

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  4. Chrome插件开发 尝试1

    1.新建文件夹 如图:整个项目的结构 2.新建一个名为manifest.json的文件,编码模式为utf-8,(可以先建好txt文件然后再将文件后缀txt改为json) 3.用记事本写入代码如下:(m ...

  5. 解决用Eclipse开发Android程序时不能生成R.java的问题

    今天我照着Mars老师的视频教程开始学习Android程序开发. 但是,我的Eclipse死活不能生成R.java文件,新建的工程也不行. 然后我百度,百度出来的结果一般是说这样解决: 1.clean ...

  6. openstack 创建虚拟机

    http://blog.csdn.net/tantexian/article/details/44595885#comments

  7. 思科(Cisco)路由器策略路由配置详解

    策略路由是路由优化的常用方法.在做路由牵引时很多情况都要用到策略路由.我刚刚接触思科这东西,对策略路由的配置还不太熟悉,今天终于配好了,记录一下. 网络拓扑 R2的E1\E2口分别与R3的E1\E2口 ...

  8. hadoop实例---多表关联

    多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息.如下 输入的是两个文件,一个代表工厂表,包含工厂名列和地址编号列:另一个代表地址表,包含地址名列和地址编号列.要求从 ...

  9. js new date详解

    创建一个日期对象: var objDate=new Date([arguments list]); var ini_date=new Date(2014,7,0); //是代表7月最后一天 ,也就是2 ...

  10. win7引导项顺序

    转载:http://jingyan.baidu.com/article/72ee561aa1d123e16138df81.html 问题描述: 个人在宿舍使用的比较多的是Window 7,而它的启动项 ...