博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Enterprise Library 2.0 -- Logging Application Block (下)
阅读量:6923 次
发布时间:2019-06-27

本文共 7459 字,大约阅读时间需要 24 分钟。

        阅读本文之前,请先阅读: 

       上一篇中我们介绍了如何去配置Logging Application Block,本文将主要介绍Logging Application Block 的基本操作以及Formatter和Trace Listeners 的自定义方法,首先我们来看如何将一个事件日志写入到一个文本文件中。
    假设我们按照上一篇的操作配置了Logging Application Block,那么配置文件中的信息如下:

None.gif
  
<
loggingConfiguration 
name
="Logging Application Block"
 tracingEnabled
="true"
None.gif    defaultCategory
="General"
 logWarningsWhenNoCategoriesMatch
="true"
>
None.gif    
<
listeners
>
None.gif      
<
add 
fileName
="trace.log"
 header
="----------------------------------------"
None.gif        footer
="----------------------------------------"
 formatter
="SHY520 Formatter"
None.gif        listenerDataType
="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        traceOutputOptions
="None"
 type
="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        name
="SHY520 Listeners"
 
/>
None.gif      
<
add 
source
="Enterprise Library Logging"
 formatter
="Text Formatter"
None.gif        log
="Application"
 machineName
=""
 listenerDataType
="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        traceOutputOptions
="None"
 type
="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        name
="Formatted EventLog TraceListener"
 
/>
None.gif    
</
listeners
>
None.gif    
<
formatters
>
None.gif      
<
add 
template
="Timestamp: {timestamp} Message: {message} Category: {category} Priority: {priority} EventId: 
None.gif
None.gif{eventid} Severity: {severity} Title:{title} Machine: {machine} Application Domain: {appDomain} Process Id: 
None.gif
None.gif{processId} Process Name: {processName} Win32 Thread Id: {win32ThreadId} Thread Name: {threadName} Extended Properties: 
None.gif
None.gif{dictionary({key} - {value} )}"
None.gif        type
="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, 
None.gif
None.gifCulture=neutral, PublicKeyToken=null"
None.gif        name
="Text Formatter"
 
/>
None.gif      
<
add 
template
="Timestamp: {timestamp} Message: {message} Category: {category} Priority: {priority} EventId: 
None.gif
None.gif{eventid} Severity: {severity} Title:{title} Machine: {machine} Application Domain: {appDomain} Process Id: 
None.gif
None.gif{processId} Process Name: {processName} Win32 Thread Id: {win32ThreadId} Thread Name: {threadName} Extended Properties: 
None.gif
None.gif{dictionary({key} - {value} )}"
None.gif        type
="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, 
None.gif
None.gifCulture=neutral, PublicKeyToken=null"
None.gif        name
="SHY520 Formatter"
 
/>
None.gif    
</
formatters
>
None.gif    
<
logFilters
>
None.gif      
<
add 
categoryFilterMode
="AllowAllExceptDenied"
 type
="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, 
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        name
="Category Filter"
 
/>
None.gif    
</
logFilters
>
None.gif    
<
categorySources
>
None.gif      
<
add 
switchValue
="All"
 name
="General"
>
None.gif        
<
listeners
>
None.gif          
<
add 
name
="SHY520 Listeners"
 
/>
None.gif        
</
listeners
>
None.gif      
</
add
>
None.gif    
</
categorySources
>
None.gif    
<
specialSources
>
None.gif      
<
allEvents 
switchValue
="All"
 name
="All Events"
 
/>
None.gif      
<
notProcessed 
switchValue
="All"
 name
="Unprocessed Category"
 
/>
None.gif      
<
errors 
switchValue
="All"
 name
="Logging Errors &amp; Warnings"
>
None.gif        
<
listeners
>
None.gif          
<
add 
name
="Formatted EventLog TraceListener"
 
/>
None.gif        
</
listeners
>
None.gif      
</
errors
>
None.gif    
</
specialSources
>
None.gif  
</
loggingConfiguration
>
下面我们来看如何将日志写入到文本文件:
None.gif
        [TestMethod]
None.gif        
public
 
void
 DoLog()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif
{
InBlock.gif            
//创建一个日志条目
InBlock.gif
            LogEntry log = new LogEntry();
InBlock.gif            
//指定该日志所属类别
InBlock.gif
            log.Categories.Add("General");
InBlock.gif            
//日志标题
InBlock.gif
            log.Title = "SHY520's Tests";
InBlock.gif            log.Message 
= "there is log information";
InBlock.gif            
//优先级
InBlock.gif
            log.Priority = 0;
InBlock.gif
InBlock.gif            Logger.Write(log);
ExpandedBlockEnd.gif        }

      上面的代码中,我们为该日志指定所属类别为General,在配置文件中我们可以看到General这个类别使用的Trace Listener是SHY520 Listeners,SHY520 Listeners是一个Flat File Trace Listener,它指定了我们的日志信息输出的地方(trace.log),我用的测试项目,运行测试后,该文件在TestResult/out目录中,如果是一般的Web项目或Consle项目,该文件则在Bin/Debug目录下,下面我们来看一下输出的日志信息:
671.gif
上图中,我们可以看到我们在程序中记录的一些日志信息,我们还可以记录一些额外的信息,这些信息是键值对应的,在1.0版本中我们用Hashtable,这里我们用的是一个泛型的Dictionary类型,代码如下:

None.gif
        [TestMethod]
None.gif        
public
 
void
 LoggEntry()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif
{
InBlock.gif            LogEntry log 
= new LogEntry();
InBlock.gif            
//事件ID
InBlock.gif
            log.EventId = 2000;
InBlock.gif            
//日志优先级
InBlock.gif
            log.Priority = 2;
InBlock.gif            log.Message 
= "Test LogEntry 2";
InBlock.gif
InBlock.gif            
//日志类别
InBlock.gif
            ICollection<string> coll = new List<string>();
InBlock.gif            coll.Add(
"General");
InBlock.gif            log.Categories 
= coll;
InBlock.gif
InBlock.gif            
//添加额外信息
InBlock.gif
            Dictionary<stringobject> dic = new Dictionary<stringobject>();
InBlock.gif            dic.Add(
"name""SHY520");
InBlock.gif            dic.Add(
"sex","");
InBlock.gif            dic.Add(
"age""22");
InBlock.gif
InBlock.gif            log.ExtendedProperties 
= dic;
InBlock.gif            
//写入日志
InBlock.gif
            Logger.Write(log);
ExpandedBlockEnd.gif        }

然后运行测试,在TestResult/Out目录下的trace.log文件中就能看到我们在程序中添加的额外信息了。
672.gif
下面我们来介绍一下过滤器的用法:
实现方法很简单,这里我们假设我们已经按照上一篇文章中的方法配置好了一个Category Filter,在Category Filter中我们可以设置要过滤掉哪种类别的事件日志,具体实现方式有两种,如下:
方法一:

None.gif
        [TestMethod]
None.gif        
public
 
void
 TestFilter1()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif
{
InBlock.gif            LogEntry logEntry 
= new LogEntry();
InBlock.gif            logEntry.Priority 
= 2;
InBlock.gif            logEntry.Categories.Add(
"General");
InBlock.gif
InBlock.gif            
//ShouldLog()方法根据Filter配置返回是否需要记录日志
InBlock.gif
            if (Logger.GetFilter<CategoryFilter>().ShouldLog(logEntry.Categories))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//TODO:记录日志
InBlock.gif
                Logger.Write(logEntry);
ExpandedSubBlockEnd.gif            }
ExpandedBlockEnd.gif        }
方法二:
None.gif
        [TestMethod]
None.gif        
public
 
void
 TestFilter2()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif
{
InBlock.gif            LogEntry logEntry 
= new LogEntry();
InBlock.gif            logEntry.Priority 
= 2;
InBlock.gif            logEntry.Categories.Add(
"General");
InBlock.gif
InBlock.gif            
if (Logger.ShouldLog(logEntry))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Logger.Write(logEntry);
ExpandedSubBlockEnd.gif            }
ExpandedBlockEnd.gif        }

        关于事件日志的过滤就说到这里,下面我们来看看如何创建一个自定义的Trace Listener,首先我们新建一个类(MyListener),并且继承与CustomTraceListener,同时不要忘了在为这个新建的类加上[ConfigurationElementType(typeof(CustomTraceListenerData))]的Attribute,最后重写基类的三个方法,在每个方法中加入自己需要的逻辑既可。完整的类的代码如下:

None.gif
using
 System;
None.gif
using
 System.Collections.Generic;
None.gif
using
 System.Text;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Logging;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
None.gif
None.gif
namespace
 Enterprise_Library_2
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    [ConfigurationElementType(
typeof(CustomTraceListenerData))]
InBlock.gif    
public class MyListener : CustomTraceListener
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public override void  TraceData(System.Diagnostics.TraceEventCache eventCache, string source, System.Diagnostics.TraceEventType eventType, int id, 
InBlock.gif
InBlock.gif
object data)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (data is LogEntry && this.Formatter != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.WriteLine(this.Formatter.Format(data as LogEntry));
ExpandedSubBlockEnd.gif            }
InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.WriteLine(data.ToString());
ExpandedSubBlockEnd.gif            }
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif
InBlock.gif        
public override void Write(string message)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//TODO:添加自己所需的逻辑
ExpandedSubBlockEnd.gif
        }
InBlock.gif
InBlock.gif        
public override void WriteLine(string message)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//TODO:添加自己所需的逻辑
ExpandedSubBlockEnd.gif
        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}

然后我们在配置Trace Listener的时候选择Custom Trace Listener就可以了。

接下来我们来看看如何自定义Formatter,实现的方法和上面类似,首先新建一个类MyFormatter,继承ILogFormatter接口,同时加上[ConfigurationElementType(typeof(CustomFormatterData))]的Attribute,完整的代码如下:

None.gif
using
 System;
None.gif
using
 System.Collections.Generic;
None.gif
using
 System.Text;
None.gif
using
 System.Collections.Specialized;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Logging;
None.gif
using
 Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
None.gif
None.gif
namespace
 Enterprise_Library_2
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    [ConfigurationElementType(
typeof(CustomFormatterData))]
InBlock.gif    
public class MyFormatter : ILogFormatter    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public MyFormatter(NameValueCollection nv)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//注意:构造函数的参数必须是NameValueCollection类型的
ExpandedSubBlockEnd.gif
        }
InBlock.gif
InBlock.gif        
public string Format(LogEntry log)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
string result = string.Empty;
InBlock.gif
InBlock.gif            
//TODO:此处添加我们个性化的Formatter逻辑
InBlock.gif
InBlock.gif            
return result;
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}

到这里,关于Logging Application Block的有关问题已经都简单的介绍了一下,有遗漏错误的地方,请指正,谢谢!

希望对初学者有所帮助,同时也欢迎Enterprise Library学习者一起共同交流经验。

Email :

转载地址:http://fhkjl.baihongyu.com/

你可能感兴趣的文章
VB 6.0中判断是否Access 2010中存在指定表格
查看>>
人工智能冲击下,IT人员如何提前避免被淘汰?
查看>>
Powershell批量解锁被锁定的AD账号
查看>>
分组取前N记录
查看>>
浅谈工作中使用过的几种数据库
查看>>
DB2在线增量备份失败的案例分析
查看>>
谈谈读“SEO实战密码”的一些感悟
查看>>
云渠道英雄榜
查看>>
ComponentOne Xuni助力Xamarin开发者突破百万,快速开发Android、IOS Apps
查看>>
关于在产品环境中使用 MySQL 5.6 GTIDs 的一些问答
查看>>
Heartbeat3.x应用全攻略之: 测试Heartbeat的HA功能
查看>>
利用inotifywait监控主机文件和目录
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
aix中的几个小技巧与日志
查看>>
企业集群平台架构实现与应用实战(HAproxy+keepalived篇)
查看>>
京东商城IPO 大平台局面形成的几个因素
查看>>
【博客话题】我的技术之旅
查看>>
DB2中如何快速定位锁等待语句
查看>>
渠道下沉的京东家电,将如何平衡服务和产品差异化?
查看>>
培养情商,现在也不晚
查看>>