Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇

时间:2022-08-21 08:47:31
  写在前面:最近一段时间项目比较紧,所以这篇随笔出来的晚一些。今天写的是在日志里面包含名 - 值对的字典,跟踪活动并记录上下文信息,过滤事件,定制日志消息的格式,自定义 Sink ,自定义 Formatter 等。

一.在日志里面包含名-值对的字典:

在日志消息里面,我们可以包含名-值对这样的字典。这时首先需要创建一个Hashtable,通过Key-Value的方式把要记录的内容传入。示例代码如下:

 1 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 ///创建一个日志项
 2 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            LogEntry log  =   new  LogEntry();
 3 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            
 4 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇             ///创建名-值对
 5 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            Hashtable logtable  =   new  Hashtable();
 6 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            logtable[ " key1 " =   " value1 " ;
 7 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            logtable[ " key2 " =   " value2 " ;
 8 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            logtable[ " key3 " =   " value3 " ;
 9 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            
10 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            log.Message  =   this .txt_LogMessage.Text;
11 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            log.Category  =  Category.General;
12 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            log.Priority  =  Priority.Normal;
13 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            
14 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇             ///写入日志
15 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            Logger.Write(log,logtable);

输出后的文本:在这里我们用了Text Formatter

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
二.跟踪活动并记录上下文信息:

跟踪应用系统的活动是一项常见的功能,我们需要把活动的起始时间和结束时间以及活动的其他的信息记录下来。日志和监测应用程序块支持通过活动ID来跟踪一项活动,活动ID可以在代码中指定,也可以通过程序块来自动生成,程序块自动记录活动的起始时间和结束时间。活动跟踪由Tracer类来提供。示例代码如下:

1 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇using ( new  Tracer( " UI Events " ))
2 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇             {
3Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                Logger.Write("Troubleshooting message");
4Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            }

输出后的文本:同样我们用了Text Formatter

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇

三.过滤事件:

在日志和监测应用程序块里面,支持两种方式的过滤事件:基于优先级过滤事件和基于类别过滤事件。过滤的过程发生在日志项传递给分发策略之前。在入门篇里我们知道,每个日志消息都会有一个优先级,我们可以在代码中指定或默认值为-1。我们可以通过配置 Client Setting使低于某个优先级的消息被过滤掉,只记录某个类别的消息或者过滤掉具有某个类别的日志项。

在下面的图中,日志项为01的消息将不被记录。

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
Client Setting
CategoryFilterSettings属性决定某个类别的日志是被记录还是被过滤掉。我们可以自行进行设置:

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
在下图中,
”UI Events”类别的日志将不被记录。

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
四.定制日志消息的格式:

Formatter接受一个日志项的并返回一个格式化的字符串,应用程序块格式化将字符串传给SinkText Formatter 使用模版生成格式化字符串,在应用配置中可以有多个 Text Formatters,每个有自己的模版同时我们也可以定制自己的 Formatter

日志项根据其类别导向到目的地目的地规定了 Formatter 和接收格式化日志项的 Sink

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
Text Formatter
有一个模版配置属性。

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇

模版编辑器定制日志项的格式, {参数}由日志项的值填充。

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
五.创建和使用自定义
Sink

在日志和监测应用应用程序块里面,允许我们自定义一个Sink,而且使用方法要比其它的应用程序块中的自定义简单的多。下面我们具体看一下:

1.添加对应用程序块的引用:

Microsoft.Practices.EnterpriseLibrary.Configuration.dll

Microsoft.Practices.EnterpriseLibrary.Logging.dll

2.添加命名空间:

1 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇using  Microsoft.Practices.EnterpriseLibrary.Configuration;
2 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging;
3 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Sinks;
4 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Distributor.Configuration;

3.编写代码:

我们的自定义Sink要继承LogSink这个基类,同时要重载Initialize()和SendMessageCore()这两个抽象方法

 1 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇using  System;
 2 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Configuration;
 3 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging;
 4 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Sinks;
 5 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Distributor.Configuration;
 6 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
 7 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 namespace  EnterpriseLogging
 8 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 {
 9Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    /// <summary>
10Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    /// 功能说明:自定义Sink
11Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    /// </summary>

12Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    public class ConsoleSink:  LogSink
13Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    {
14Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        private LoggingConfigurationView configView;
15Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 
16Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        public override void Initialize(ConfigurationView configurationView)
17Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        {
18Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            this.configView = configurationView as LoggingConfigurationView;
19Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        }
 
20Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 
21Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        protected override void SendMessageCore(LogEntry logEntry)
22Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        {
23Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            CustomSinkData sinkData;
24Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            sinkData = (CustomSinkData) this.configView.GetSinkData(this.ConfigurationName); 
25Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 
26Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            /// Delimit each log entry
27Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            Console.WriteLine((string) sinkData.Attributes["delimiter"]); 
28Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 
29Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            /// Write the formatted log entry to the Console
30Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            Console.WriteLine(FormatEntry(logEntry));
31Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        }
 
32Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    }

33Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇}

34 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇

4.打开配置工具,并打开配置文件。在Sink节点上,我们选择Custom Sink。同时起名为Console Sink

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
5
.单击TypeName右边的省略号,打开Type Selector对话框。单击Load an Assembly …,并浏览选择我们工程文件的DLL。最后选择Console Sink类。

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
6
.单击Attributes 打开NameValueItem Collection Editor。单击Add创建一个新的NameValueItem,起名为delimiter,并设置它的Value值(这个值可以随意设置,比如我们设置************************)。

Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
7.选择General,创建一个Destination,并设置下列属性:

·   Formatter = Text Formatter,

·   Name = Console Destination

·   Sink = Console Sink

8.把程序输出的方式设为控制台的方式,运行程序。

六.创建和使用自定义Formatter

1.添加如下的命名空间:

1 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇using  System.Globalization;
2 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  System.IO;
3 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  System.Xml;
4 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Configuration;
5 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging;
6 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Distributor.Configuration;
7 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;

2.以Hands On Lab里面的XmlFormatter为例,在自定义Formatter时我们需要继承ConfigurationProvider类和实现 IlogFormatter接口,并且需要重载Initialize()这个抽象方法。

 1 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇using  System;
 2 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  System.Globalization;
 3 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  System.IO;
 4 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  System.Xml;
 5 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Configuration;
 6 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging;
 7 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Distributor.Configuration;
 8 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 using  Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
 9 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
10 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 namespace  LoggingSink
11 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 {
12Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    /// <summary>
13Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    /// 功能说明:自定义Formatter
14Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    /// </summary>

15Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    public class XmlFormatter : ConfigurationProvider, ILogFormatter
16Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    {
17Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        private LoggingConfigurationView configView = null;
18Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 
19Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        public override void Initialize(ConfigurationView configurationView)
20Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        {
21Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            this.configView = (LoggingConfigurationView) configurationView;
22Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        }
 
23Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 
24Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        public string Format(LogEntry log)
25Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        {
26Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture))
27Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            {
28Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                XmlTextWriter w = new XmlTextWriter(sw);
29Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.Formatting = Formatting.Indented;
30Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.Indentation = 2
31Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteStartDocument(true);
32Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteStartElement("logEntry");
33Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteAttributeString("Category", log.Category);
34Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteAttributeString("Priority", log.Priority.ToString(CultureInfo.InvariantCulture)); 
35Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("Timestamp", log.TimeStampString);
36Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("Message", log.Message);
37Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("EventId", log.EventId.ToString(CultureInfo.InvariantCulture));
38Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("Severity", log.Severity.ToString(CultureInfo.InvariantCulture));
39Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("Title", log.Title);
40Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("Machine", log.MachineName);
41Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("AppDomain", log.AppDomainName);
42Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("ProcessId", log.ProcessId);
43Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("ProcessName", log.ProcessName);
44Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("Win32ThreadId", log.Win32ThreadId);
45Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteElementString("ThreadName", log.ManagedThreadName);
46Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteEndElement();
47Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                w.WriteEndDocument(); 
48Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇                return sw.ToString();
49Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇            }

50Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇        }
 
51Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇    }

52Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇}

53 Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇

对于自定义的Formatter我们就介绍到这儿了,它的使用和一般的Formatter没有大的区别,只不过在创建Formatter时我们需要创建一个Custom Formatter,在这里我就不多写了。

 结束语:这篇日志和监测应用程序块的进阶篇文章就到这里了,希望能给初学的朋友一些帮助。后面我会写缓存应用程序块的使用。