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

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

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

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

创建数据库:

 

 

 

Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇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%)

创建表:

 

Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇CREATE TABLE [dbo].[Log] (
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[LogID] [int] IDENTITY (11NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[EventID] [int] NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Category] [nvarchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Priority] [int] NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Severity] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Title] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Timestamp] [datetime] NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[MachineName] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[AppDomainName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[ProcessID] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[ProcessName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[ThreadName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Win32ThreadId] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[Message] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇    
[FormattedMessage] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
GO
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇

 

创建存储过程:

 

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

 

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

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

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

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

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

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

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

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

 

 1        }

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

二.异常的传播机制

异常的传播机制有以下几种:

l        异常自动传播

l        在同一层内部,捕获或者再抛出原有异常

l        捕获,包装和抛出包装后的异常

我们不推荐直接抛出原有异常,因为恶意的用户能够从系统诊断信息中得知应用的详细情况,并从中查找应用的弱点。异常应用程序块提供了一旦配置的Handler执行后,就产生对应的post-handling动作,该动作有如下选项:

None 没有重抛异常的动作。

NotifyRethrow 告诉调用程序:Policy推荐应该重抛异常。

ThrowNewException 在所有的Handler执行后,向调用程序抛出最终异常(并不一定是原始的异常)。

 


三.异常的格式化

可以格式化任何System.Exception类型的异常

能够用来记录或者显示异常的详细信息

字符型格式化器——TextExceptionFormatter:创建在一个屏幕上,日志中或以其他形式表现的,可以表现异常信息的详细记录

XML格式化器——XMLExceptionFormatter:针对一个异常,创建一个用XML表现形式表现记录,每一个异常的属性,均可以被存储为XML元素。

看一下在Enterprise Library Quick Start中提供的自定义的ExceptionFormatter,实现了TextExceptionFormatter类:

 

 1    }

 

四.创建自定义的异常处理器

异常处理应用程序块允许您包装并使用您自己的例外业务处理流程,例如在时间记录系统中填写一个事件,利用业务规范进行包装和替代,利用另外的记录系统进行记录(比较常用的有Log4net,前段时间深渊野鱼介绍的,还没用过^_^),这种灵活的可配置性,将允许您在不同的异常类型及其策略中灵活的配置。

 

可以通过实现ExceptionHandler抽象类,来创建定制的Handler

1Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇public abstract class ExceptionHandler : ConfigurationProvider, IExceptionHandler

该抽象类继承ConfigurationProvider类,并实现IExceptionHandler接口。ConfigurationProvider抽象类实现了IConfigurationProvider接口,用来读取配置数据。

1Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇public abstract class ConfigurationProvider : IConfigurationProvider

使用支持序列化的数据类型作为配置参数,还有要注意数据类型的简单,避免“Exception Handling Exceptions

看一下在Enterprise Library Quick Start中提供了定制Handler的实现:

 

 1  }

相关文章:

  • 2021-08-17
  • 2021-12-21
  • 2021-10-16
  • 2021-07-05
猜你喜欢
  • 2021-09-06
  • 2021-05-20
  • 2022-02-26
相关资源
相似解决方案