原文参考 http://msdn.microsoft.com/en-us/library/dn440731(v=pandp.60).aspx

一、简介

日志通常满足两个主要的要求:1、监控应用程序性能并提供信息。性能方面,日志可以监控程序内部发生了什么,有时也监控程序外部发生了什么。2、更重要的是用于审计。这种日志可以跟踪用户的行为并且记录用户执行的一系列任务、读取和修改的信息、访问的资源。

日志模块是一个高灵活和可配置的解决方案,它允许以灵活多样的方式创建和存储日志信息于各种位置、分类并过滤信息、收集调试过程中的上下文信息、审计跟踪并记录。

二、日志模块能做什么?

日志模块可以使日志功能和应用程序代码分离。它可以把日志条目发送到Windows 事件日志、数据库、文本文件,也可以生成包含日志信息的邮件、windows消息队列等。也可以自定义发送目的。应用程序中,仅需简单地用合适的对象(如Logwriter)生成一个日志条目,然后调用其方法把日志条目写入相应的目标位置。

图1-An overview of the logging process and the objects in the Logging block

三、日志的代价和额外的上下文信息

无论怎样实现日志,它总会有一些性能影响。日志模块提供了灵活的、高度可配置的日志解决方案,并且经过精心设计来最小化性能影响。但是,你仍然需要知道这个影响,并且要考虑你的日志方案会如何影响它,需要在需求之间平衡。

LogWriter自动收集一些像时间、应用程序、机器名字、进程ID等上下文信息。为了最小化性能影响,LogWriter类缓存了这些值并且采用了延迟最小化——即只有当被一个Listener实际使用时才去创建。
然而,收集额外的上下文信息的代价是非常高的并且浪费宝贵的资源,这可能会影响性能。因此,在创建LogEntry时,只有指定需要某些不常用的信息时,日志模块才去收集。日志模块中的四个类可以收集指定的上下文信息,包括COM+、当前堆栈、运行时安全相关以及系统安全相关。LogEntry还有一个字典属性允许程序员添加信息。

四、怎样使用Logging Block?

其中的关键是创建日志条目,然后调用方法把这个日志条目写入目标。

1、添加LoggingBlock的引用到项目中

需要添加的引用有Microsoft.Practices.EnterpriseLibrary. Logging.dll,如果日志要写入数据库还要引用 Microsoft.Practices.EnterpriseLibrary. Logging.Database.dll

2、配置Loggin Block

配置Logging Block可以用代码的方法,也可以用配置工具,这里介绍配置工具的方法。

Step1启动配置工具。运行"EntLibConfig.exe",点击"File|Open"打开目标程序的配置文件(Web.config或App.config),打开文件后如图1:

图1

Step2配置。如果左边导航栏未出现"Logging Settings"节点则表明以前未进行过企业库日志相关的配置,此时点击"Blocks|Add Logging Settings",出现图2界面:

图2

如果是修改配置请右击"Logging Settings"选择"Show/Hide Application Block Elements"(或点击前面的三角符号)也会出现上图。

查看图2,先不要管"Logging Filters",界面被两条竖线划分成左中右三个区域,左边的是Category(日志类别),中间的是Listener(保存日志文件的载体),右边是Formatter(日志内容格式化器)。一个Category可以包含多个Listener,即一份日志可以写入多个载体中,一个Listener对应一个Formatter。

Logging Target Listener
保存日志的监听器,其中定义了日志保存的位置(日志载体):数据库、XML文件、FlatFile(文本文件)、Windows事件等10个位置。点击"Logging Target Listeners"右方的"+"号,可以添加日志载体。日志载体可分为10种类型:

Log Message Formatters日志内容格式器。用于设置日志的格式。每一个Listener需要设定唯一一个Formatters,一个Formatters可以被多个Listener使用。

Categories分类。每一个分类都有一个名字,每一个分类中包含一个或者多个Listener。当调用LogWriter.Write()方法时,需要给该方法指定所使用的分类的名字(如果不指定分类的名字则使用默认分类),write方法根据分类的名字找到其中包含的Listener,把日志内容写到每一个Listener中,其内容根据Formatter进行格式设置。如果你的应用程序需要不同类型的日志信息,你可以定义多个分类,比如:应用程序警告可以定义一个分类,该分类中包含Windows Event Listener;而用户的所有操作信息写到文本文件中,这就需要定义另外一个分类,其中包含Flat File Listener。

五、使用LogWriter创建和写入日志条目

(1)使用LogWriter的Write方法时,首先获得一个LogWriter实例,获得该实例需要一个LoggingConfiguration对象作为参数。

LoggingConfiguration loggingConfiguration = BuildProgrammaticConfig();

LogWriter defaultWriter = new LogWriter(loggingConfiguration);

(2)或者用LogWriterFactory类来自动读取配置文件,然后创建实例

LogWriterFactory logWriterFactory = new LogWriterFactory();
LogWriter logWriter = logWriterFactory.Create();

下面的几个例子演示了如何使用Write方法

// Check if logging is enabled before creating log entries.
if (defaultWriter.IsLoggingEnabled())
{
  defaultWriter.Write("Log entry created using the simplest overload.");
  defaultWriter.Write("Log entry with a single category.", "General");
  defaultWriter.Write("Log entry with a category, priority, and event ID.",

"General", 6, 9001);
  defaultWriter.Write("Log entry with a category, priority, event ID, "
                      + "and severity.", "General", 5, 9002,
                      TraceEventType.Warning);
  defaultWriter.Write("Log entry with a category, priority, event ID, "
                      + "severity, and title.", "General", 8, 9003,
                      TraceEventType.Warning, "Logging Block Examples");
}
else
{
  Console.WriteLine("Logging is disabled in the configuration.");
}

上面的内容对日志相关的基本知识和总体思路进行了说明。后面的部分会对涉及到的某些知识详细的介绍。

六、Categories

从该图可以看到,其需要设置的内容不多,Name:分类的名称。AutoFlush:设置为Ture时,每当调用Write()时,自动把日志信息写到目标;设置为Flase时,调用Write()时,日志仅仅写入缓存,当调用Listener的Flush方法时才写入目标。Listeners是该分类包含的目标监听器,可以根据需要添加多个监听器。

Enterprise Library 6——Using the Logging Application Block的更多相关文章

  1. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图:   从上图我们可以 ...

  2. Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    Download dll: http://www.microsoft.com/en-us/download/confirmation.aspx?id=15104 http://www.cnblogs. ...

  3. 微软Enterprise Library 4.1和Unity 1.2

    说明 微软模式与实践团队今天发布了Enterprise Library 4.1和Unity 1.2版本,这次发布的主要新特性如下: 1. 支持Visual Studio 2008 SP1 2. Uni ...

  4. Enterprise Library系列文章目录(转载)

    1. Microsoft Enterprise Library 5.0 系列(一) Caching Application Block (初级) 2. Microsoft Enterprise Lib ...

  5. Enterprise Library 5.0 系列教程

    1. Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (初级) 2. Microsoft Enterprise L ...

  6. 系列文章--Enterprise Library文章总结

    自Enterprise Library 1.1 推出以来,Terry写了一系列的关于Enterprise Library的文章,其中得到了很多朋友的支持,在这里一并表示感谢.为了方便大家的阅读,这里我 ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block 代理对象(Proxy Object) ...

随机推荐

  1. 在rdlc 中 显示成 yyyy年MM月dd日

    在rdlc 中  显示成  yyyy年MM月dd日, 采用: =First(Format(Fields!添加时间.Value,"yyyy年MM月dd日")  )

  2. JAVA之执行cmd命令

    感言在前:时隔好久没有更新博客园了,忙东忙西也没忙出个什么之所以然来.回首过去一两个月,只能用“疲倦”两个字来形容,而且是身心疲惫.每天11.12个小时的工作我都没觉得烦,但是总是想克服却又很难克服的 ...

  3. js中关于原型的几个方法

    一.isPrototypeOf()方法,判断一个对象是否是另一个对象的原型 function Student(name,age){ this.name=name; this.age=age; } va ...

  4. (转)从集中到分布,解读网络视频IT架构变迁

    2006年以视频网站为代表的网络视频行业迅速崛起,IPTV.视频分享网站.视频搜索网站.提供视频服务的互动社区.交友.播客等等新兴媒体发展迅猛.网络视频行业现已成为众多资本机构关注与投资的焦点.但是在 ...

  5. PowerDesigner提示This data item is already used in a primary identifier.的处理

    原文链接: http://blog.csdn.net/lopper/article/details/5293545 今天同事在编制一个数据库脚本的时候,提示了This data item is alr ...

  6. request.getSession();为什么不用response儿用request!

    首先回答为什么分别是response和request这两个内置对象.你得先明白你通过获取对象是做什么用的,是往哪用的.第一个PrintWriter out=response.getWriter()是想 ...

  7. 对session和cookie的一些理解

    由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.);                  response.addCookie(c1);   * ...

  8. 分享:mysql 随机查询数据

    在mysql中查询5条不重复的数据,使用以下: 1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5  就可以了.但是真正测试一下才发现这样效率非常低.一个1 ...

  9. WINDOWS下PHP 的pear DB的安装(本地环境:PHP5.4.15+Apache+mysql)

    因为需要安装phpunit,要先装pear,网上的教程大多数是以双击go-pear.bat开始,但是我安装的php文件夹里压根没有这个文件. 经过几次搜索之后终于找到了办法. 解决步骤如下: 1.下载 ...

  10. delphi图形图像开发相关

    ①delphi的图形处理(doc) http://wenku.baidu.com/view/519df09951e79b89680226ee.html ②delphi的图形图像处理(ppt) http ...