Enterprise Library 2.0 -- Logging Application Block (补充)

本文详细介绍如何使用EnterpriseLibrary2.0将日志信息写入数据库,包括创建日志表、存储过程及配置文件的步骤。

        在前面的文章中,有朋友提到我们在实际项目中往往是把一些事件的日志(比如异常)写入到数据库中,这样更方便查看和管理,而在前面的文章中我都是以写入到文本文件为例的,今天这篇文章就算是对前两篇的一个补充,主要来介绍如何将日志信息写入到数据库中,同时也很感谢那位朋友的建议,下面我们进入正题,分为以下几个步骤:
       一、 根据Enterprise Library 2.0中将日志写入到数据库中的需要,我们在数据库中添加一张记录日志的表(RX_Log):

None.gif -- 日志信息表
None.gif
create   table  RX_Log
None.gif(
None.gif    id                        
int   identity           not   null ,         -- 流水号
None.gif
    EventId                     int                   null ,             -- 事件ID
None.gif
    Priority                 int                      null ,             -- 优先级
None.gif
    Category                 varchar ( 1000 )         null ,             -- 类别
None.gif
    Title                     varchar ( 500 )         null ,             -- 日志标题
None.gif
    Message                     varchar ( 1000 )         null ,             -- 日志信息
None.gif
    Machine                     varchar ( 100 )         null ,             -- 主机名
None.gif
    Timestamps                 smalldatetime          null ,             -- 记录时间
None.gif
    Severity                 varchar ( 100 )         null ,             -- 严重级别
None.gif
    ApplicationDomain         varchar ( 1000 )         null ,             -- 应用程序名
None.gif
    ProcessId                 int                      null ,             -- 进程ID
None.gif
    ProcessName                 varchar ( 500 )         null ,             -- 进程名
None.gif
    Win32ThreadId             int                      null ,             -- 线程ID
None.gif
    ThreadName                 varchar ( 500 )         null ,             -- 线程名
None.gif
    ExtendedProperties         varchar ( 1000 )         null ,             -- 扩展信息
None.gif

None.gif    
primary   key (id)
None.gif)

 Logging Application Block 在写日志到数据库的过程中,还需要两个存储过程(注意:这也是和1.0的一点小区别,上一个版本只需要一个存储过程),分别为:

None.gif -- 建立存储过程
None.gif--
写日志
None.gif
create   procedure  usp_writelogtodatabase
None.gif(
None.gif    
@EventId                  int ,
None.gif    
@Priority                  int ,
None.gif    
@Title                      varchar ( 500 ),
None.gif    
@Message                  varchar ( 4000 ),
None.gif    
@machineName              varchar ( 100 ),
None.gif    
@Timestamp                  smalldatetime ,
None.gif    
@Severity                  varchar ( 100 ),
None.gif    
@AppDomainName              varchar ( 1000 ),
None.gif    
@ProcessId                  int ,
None.gif    
@ProcessName              varchar ( 500 ),
None.gif    
@Win32ThreadId              int ,
None.gif    
@ThreadName                  varchar ( 500 ),
None.gif    
@formattedmessage          varchar ( 4000 ),
None.gif    
@LogId                      int     out
None.gif)
None.gif
as
None.gif
begin
None.gif
None.gif    
insert   into  RX_Log 
None.gif    (
None.gif        EventId,
None.gif        Priority,
None.gif        Title,
None.gif        Message,
None.gif        Machine,
None.gif        Timestamps,
None.gif        Severity,
None.gif        ApplicationDomain,
None.gif        ProcessId,
None.gif        ProcessName,
None.gif        Win32ThreadId,
None.gif        ThreadName,
None.gif        ExtendedProperties
None.gif    )
None.gif    
values
None.gif    (
None.gif        
@EventId ,
None.gif        
@Priority ,
None.gif        
@Title ,
None.gif        
@Message ,
None.gif        
@machineName ,
None.gif        
@Timestamp ,
None.gif        
@Severity ,
None.gif        
@AppDomainName ,
None.gif        
@ProcessId ,
None.gif        
@ProcessName ,
None.gif        
@Win32ThreadId ,
None.gif        
@ThreadName ,
None.gif        
@formattedmessage
None.gif    )
None.gif
None.gif    
set   @LogId = @@identity
None.gif    
None.gif    
None.gif
end
None.gif
None.gif
-- 设置日志类别
None.gif
create   procedure  usp_addcategory
None.gif(
None.gif    
@categoryName          varchar ( 1000 ),
None.gif    
@logID                  int
None.gif)
None.gif
as  
None.gif
begin
None.gif    
UPDATE  RX_Log  SET  Category = @categoryName   WHERE  ID = @logID
None.gif
end

上面的工作做好之后,我们在来配置我们的配置文件,首先我们需要添加一个DataBase的Trace Listener,如下图:

6111.gif

然后指定一些该Trace Listener的属性,包括AddCategoryStoreProcedure,DataBaseInstance,Formatter,Name,TraceOutputOptions以及WriteLogStoreProcedure。

06112.gif

其中AddCategoryStoredProcedure和WriteLogStoredProcedureName就是我们刚刚在数据库中建的存储过程,前者是设置日志类别,后者为向数据库中插入日志的存储过程。DataBaseInstance是我们在Data Access Application Block中建立的一个数据库实例,具体方法可以参考: 
Enterprise Library 2.0 -- Data Access Application Block,Formatter则是我们选择上篇文章中设置的SHY520 Formatter,具体的配置方法请参考:
Enterprise Library 2.0 -- Logging Application Block (上)
Enterprise Library 2.0 -- Logging Application Block (下)
其他选项我们先保持默认,接着我们需要添加一个Category,命名为DataBase

06113.gif

然后为这个Category添加一个Trace Listener,并设置其RefrencedTraceListener为我们刚刚建的Database Trace Listener,

06114.gif

这样就完成了我们的配置工作,此时你的配置文件中(Web.Config或App.Config)应该会包含下面的信息:

None.gif <? xml version="1.0" encoding="utf-8" ?>
None.gif
< configuration >
None.gif  
< configSections >
None.gif    
< section  name ="loggingConfiguration"  type ="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"   />
None.gif    
< section  name ="dataConfiguration"  type ="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"   />
None.gif  
</ configSections >
None.gif  
< loggingConfiguration  name ="Logging Application Block"  tracingEnabled ="true"
None.gif    defaultCategory
="General"  logWarningsWhenNoCategoriesMatch ="true" >
None.gif    
< listeners >
None.gif      
< add  databaseInstanceName ="Connection String"  writeLogStoredProcName ="usp_writelogtodatabase"
None.gif        addCategoryStoredProcName
="usp_addcategory"  formatter ="SHY520 Formatter"
None.gif        listenerDataType
="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        traceOutputOptions
="None"  type ="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
None.gif        name
="Database Trace Listener"   />
None.gif    
</ listeners >
None.gif    
< formatters >
None.gif      
< add  template ="Timestamp: {timestamp} Message: {message} Category: {category} Priority: {priority} EventId: {eventid} Severity: {severity} Title:{title} Machine: {machine} Application Domain: {appDomain} Process Id: {processId} Process Name: {processName} Win32 Thread Id: {win32ThreadId} Thread Name: {threadName} Extended Properties: {dictionary({key} - {value} )}"
None.gif        type
="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=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, Microsoft.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 ="DataBase" >
None.gif        
< listeners >
None.gif          
< add  name ="Database Trace Listener"   />
None.gif        
</ listeners >
None.gif      
</ add >
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  
< dataConfiguration  defaultDatabase ="Connection String"   />
None.gif  
< connectionStrings >
None.gif    
< add  name ="Connection String"  connectionString ="Database=EnterpriseLibrary;Server=shy;Integrated Security=SSPI;uid=sa;pwd=;"
None.gif      providerName
="System.Data.SqlClient"   />
None.gif  
</ connectionStrings >
None.gif
</ configuration >

上面的工作做完之后,我们就可以在应用程序中添加代码,用于将日志写入数据库了,如下:

None.gif         [TestMethod]
None.gif        
public   void  LogToDataBase()
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 Log Information To DataBase";
InBlock.gif
InBlock.gif            
//日志类别
InBlock.gif
            ICollection<string> coll = new List<string>();
InBlock.gif            
//设置类别为DataBase,这就确定了你的日志是写入到数据库的
InBlock.gif            
//因为DataBase这个类别中包含一个DataBase Trace Listener
InBlock.gif
            coll.Add("DataBase");
InBlock.gif            
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        }

None.gif

运行这个测试方法,然后到数据库中看一下,此时上面的一条日志信息已经写入到数据库中了,关于利用Logging Application Block写日志到数据库中的方法就说到这里,如有遗漏,错误的地方,欢迎您指正!

Email:pwei013@163.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值