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

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

Enterprise Library 2.0 -- Logging Application Block (补充)    
primary key(id)
Enterprise Library 2.0 -- Logging Application Block (补充))

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

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

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

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

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

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

其中AddCategoryStoredProcedure和WriteLogStoredProcedureName就是我们刚刚在数据库中建的存储过程,前者是设置日志类别,后者为向数据库中插入日志的存储过程。DataBaseInstance是我们在Data Access Application Block中建立的一个数据库实例,具体方法可以参考: 


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

Enterprise Library 2.0 -- Logging Application Block (补充)<?xml version="1.0" encoding="utf-8"?>
Enterprise Library 2.0 -- Logging Application Block (补充)
<configuration>
Enterprise Library 2.0 -- Logging Application Block (补充)  
<configSections>
Enterprise Library 2.0 -- Logging Application Block (补充)    
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
Enterprise Library 2.0 -- Logging Application Block (补充)    
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
Enterprise Library 2.0 -- Logging Application Block (补充)  
</configSections>
Enterprise Library 2.0 -- Logging Application Block (补充)  
<loggingConfiguration name="Logging Application Block" tracingEnabled="true"
Enterprise Library 2.0 -- Logging Application Block (补充)    defaultCategory
="General" logWarningsWhenNoCategoriesMatch="true">
Enterprise Library 2.0 -- Logging Application Block (补充)    
<listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)      
<add databaseInstanceName="Connection String" writeLogStoredProcName="usp_writelogtodatabase"
Enterprise Library 2.0 -- Logging Application Block (补充)        addCategoryStoredProcName
="usp_addcategory" formatter="SHY520 Formatter"
Enterprise Library 2.0 -- Logging Application Block (补充)        listenerDataType
="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
Enterprise Library 2.0 -- Logging Application Block (补充)        traceOutputOptions
="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
Enterprise Library 2.0 -- Logging Application Block (补充)        name
="Database Trace Listener" />
Enterprise Library 2.0 -- Logging Application Block (补充)    
</listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)    
<formatters>
Enterprise Library 2.0 -- Logging Application Block (补充)      
<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} )}"
Enterprise Library 2.0 -- Logging Application Block (补充)        type
="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
Enterprise Library 2.0 -- Logging Application Block (补充)        name
="SHY520 Formatter" />
Enterprise Library 2.0 -- Logging Application Block (补充)    
</formatters>
Enterprise Library 2.0 -- Logging Application Block (补充)    
<logFilters>
Enterprise Library 2.0 -- Logging Application Block (补充)      
<add categoryFilterMode="AllowAllExceptDenied" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
Enterprise Library 2.0 -- Logging Application Block (补充)        name
="Category Filter" />
Enterprise Library 2.0 -- Logging Application Block (补充)    
</logFilters>
Enterprise Library 2.0 -- Logging Application Block (补充)    
<categorySources>
Enterprise Library 2.0 -- Logging Application Block (补充)      
<add switchValue="All" name="DataBase">
Enterprise Library 2.0 -- Logging Application Block (补充)        
<listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)          
<add name="Database Trace Listener" />
Enterprise Library 2.0 -- Logging Application Block (补充)        
</listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)      
</add>
Enterprise Library 2.0 -- Logging Application Block (补充)      
<add switchValue="All" name="General">
Enterprise Library 2.0 -- Logging Application Block (补充)        
<listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)          
<add name="SHY520 Listeners" />
Enterprise Library 2.0 -- Logging Application Block (补充)        
</listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)      
</add>
Enterprise Library 2.0 -- Logging Application Block (补充)    
</categorySources>
Enterprise Library 2.0 -- Logging Application Block (补充)    
<specialSources>
Enterprise Library 2.0 -- Logging Application Block (补充)      
<allEvents switchValue="All" name="All Events" />
Enterprise Library 2.0 -- Logging Application Block (补充)      
<notProcessed switchValue="All" name="Unprocessed Category" />
Enterprise Library 2.0 -- Logging Application Block (补充)      
<errors switchValue="All" name="Logging Errors &amp; Warnings">
Enterprise Library 2.0 -- Logging Application Block (补充)        
<listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)          
<add name="Formatted EventLog TraceListener" />
Enterprise Library 2.0 -- Logging Application Block (补充)        
</listeners>
Enterprise Library 2.0 -- Logging Application Block (补充)      
</errors>
Enterprise Library 2.0 -- Logging Application Block (补充)    
</specialSources>
Enterprise Library 2.0 -- Logging Application Block (补充)  
</loggingConfiguration>
Enterprise Library 2.0 -- Logging Application Block (补充)  
<dataConfiguration defaultDatabase="Connection String" />
Enterprise Library 2.0 -- Logging Application Block (补充)  
<connectionStrings>
Enterprise Library 2.0 -- Logging Application Block (补充)    
<add name="Connection String" connectionString="Database=EnterpriseLibrary;Server=shy;Integrated Security=SSPI;uid=sa;pwd=;"
Enterprise Library 2.0 -- Logging Application Block (补充)      providerName
="System.Data.SqlClient" />
Enterprise Library 2.0 -- Logging Application Block (补充)  
</connectionStrings>
Enterprise Library 2.0 -- Logging Application Block (补充)
</configuration>

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

Enterprise Library 2.0 -- Logging Application Block (补充)        [TestMethod]
Enterprise Library 2.0 -- Logging Application Block (补充)        
public void LogToDataBase()

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

Email:pwei013@163.com

相关文章: