原文参考 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是该分类包含的目标监听器,可以根据需要添加多个监听器。