技术开发 频道

Enterprise Library Step By Step系列(十二):异常处理应用程序块

【IT168技术文档】

一.把异常信息Logging到数据库

在日志和监测应用程序块中,有朋友提意见说希望能够把异常信息Logging到数据库中,在这里介绍一下具体的实现方法。

1.创建相关的数据库环境:

我们可以用日志和监测应用程序块自带的SQL语句来创建相关的数据库环境:

创建数据库:

CREATE DATABASE [Logging]ON (NAME = N'Logging', FILENAME = N'C:\Program Files\Microsoft
SQL Server\MSSQL\data\Logging.mdf
' , SIZE = 1, FILEGROWTH = 10%) LOG ON
(NAME
= N'Logging_log',FILENAME = N'C:\Program Files\Microsoft SQL
Server\MSSQL\data\Logging_log.LDF
' , FILEGROWTH = 10%)

创建表:

CREATE TABLE [dbo].[Log] ( [LogID] [int] IDENTITY (1, 1) NOT NULL , [EventID] [int] NULL , [Category] [nvarchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Priority] [int] NOT NULL , [Severity] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Title] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Timestamp] [datetime] NOT NULL , [MachineName] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [AppDomainName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [ProcessID] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [ProcessName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [ThreadName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Win32ThreadId] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Message] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [FormattedMessage] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO

创建存储过程:

1CREATE PROCEDURE WriteLog 2( 3 @EventID int, 4 @Category nvarchar(64), 5 @Priority int, 6 @Severity nvarchar(32), 7 @Title nvarchar(256), 8 @Timestamp datetime, 9 @MachineName nvarchar(32), 10 @AppDomainName nvarchar(2048), 11 @ProcessID nvarchar(256), 12 @ProcessName nvarchar(2048), 13 @ThreadName nvarchar(2048), 14 @Win32ThreadId nvarchar(128), 15 @Message nvarchar(2048), 16 @FormattedMessage ntext 17) 18AS 19 20 INSERT INTO [Log] ( 21 EventID, 22 Category, 23 Priority, 24 Severity, 25 Title, 26 [Timestamp], 27 MachineName, 28 AppDomainName, 29 ProcessID, 30 ProcessName, 31 ThreadName, 32 Win32ThreadId, 33 Message, 34 FormattedMessage 35 ) 36 VALUES ( 37 @EventID, 38 @Category, 39 @Priority, 40 @Severity, 41 @Title, 42 @Timestamp, 43 @MachineName, 44 @AppDomainName, 45 @ProcessID, 46 @ProcessName, 47 @ThreadName, 48 @Win32ThreadId, 49 @Message, 50 @FormattedMessage) 51GO

SQL语句默认的路径为C:\Program Files\Microsoft Enterprise Library\src\Logging\Sinks\Database\Scripts,直接运行CreateLoggingDatabase.cmd即可。

2.运行配置工具,我们创建一个日志和监测应用程序块,并建一个Database Sink,具体的配置方法在日志和监测应用程序块中讲过了,这里就不重复了,我们看一下它的配置:



 

 

注意设置StoredProcNameWriteLog,就是我们刚才创建的存储过程。

3.同时再创建一个Category,起名为DataException,并设置它的SinkDatabase Sink

4.设置Logging HandlerLogCategory为我们刚才创建的DataException,其他的参数暂时默认。


 

 

5.至此配置完成,在程序中我们不需要做任何改动(这就是企业库的配置驱动的思想精妙之处^_^)。

1/**//// <summary> 2 /// 日志策略 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void btn_Log_Click(object sender, System.EventArgs e) 7 { 8 try 9 { 10 Exception ex = new Exception(); 11 throw ex; 12 } 13 catch(Exception ex) 14 { 15 bool Flag = ExceptionPolicy.HandleException(ex,"Log Policy"); 16 17 if(Flag) 18 { 19 throw; 20 } 21 } 22 }

补充一点:在项目中要添加对Microsoft.Practices.EnterpriseLibrary.Logging.Sinks.Database.dll的引用

 

 

 

0
相关文章