黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
企业库日志应用程序模块工作原理图:

从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信息都可以在Category配置文件中反映出来,通过配置文件,调用LogWriter类的Writer方法,就可以将包含日志信息的LogEntry实体写入Category配置文件中指定的设备了.
企业库日记应用程序模块提供了下列几种记录方法:
- The event log
- An e-mail message
- A database
- A message queue
- A text file
- A Windows®Management Instrumentation (WMI) event
- Custom locationsusing application block extension points
本文介绍一下如何使用企业库日记应用程序模块向日志文件,数据库,XML文件中写入程序操作日记:
一. 向日志文件写入日记
- 运行EntLibConfig.exe,选择Blocks菜单 ,单击 Add LoggingSettings .

2. 对每个模块进行配置:

3. 点击
File菜单,单击
Save,保存为一个App.config文件,可以先保存到桌面,之后要用到它.
4. 创建一个新的控制台应用程序,将App.config添加到程序内,并加入需要的Dll文件,在此我们要导入的是
Microsoft.Practices.EnterpriseLibrary. Logging.dll, Microsoft.Practices.EnterpriseLibrary.
Logging.Database.dll并添加需要的引用:

添加引用:
using Microsoft.Practices.EnterpriseLibrary. Logging;
5. 测试:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.Practices.EnterpriseLibrary.Logging;namespace ConsoleApplication1{ class Program { staticvoid Main(string[] args) { LogEntry logEntry =new LogEntry(); logEntry.EventId =; logEntry.Priority =; logEntry.Title ="标题党"; logEntry.Message ="http://www.cnblogs.com/huangcong/"; logEntry.Categories.Add("C#学习"); logEntry.Categories.Add("Microsoft Enterprise Library学习"); Logger.Writer.Write(logEntry, "General"); Console.WriteLine("日志写入完成!"); } }}
运行结果:

6. 开始—控制面板—系统和安全—查看事件日志—Windows日志—应用程序:

7. 第一个日志就是我们刚刚写入的日志啦,双击可以查看内容:

二. 向数据库写入日记
1.
要将日志写入数据库,就得先新建一个日志数据库,我们可以在EntLib50Src文件夹下的Source\Blocks\Logging\Src\DatabaseTraceListener\Scripts目录中找到LoggingDatabase.sql文件,只要在数据库中运行即可自动生成一个日志数据库:

为了方便大家,我直接将该文件发布在下面,大家直接复制到SQL中运行也可以:
USE[master]
GO
IFEXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'Logging')
DROPDATABASE[Logging]
GO
CREATEDATABASE[Logging]
COLLATE SQL_Latin1_General_CP1_CI_AS
GO
exec sp_dboption N'Logging', N'autoclose', N'false'
GO
exec sp_dboption N'Logging', N'bulkcopy', N'false'
GO
exec sp_dboption N'Logging', N'trunc. log', N'false'
GO
exec sp_dboption N'Logging', N'torn page detection', N'true'
GO
exec sp_dboption N'Logging', N'read only', N'false'
GO
exec sp_dboption N'Logging', N'dbo use', N'false'
GO
exec sp_dboption N'Logging', N'single', N'false'
GO
exec sp_dboption N'Logging', N'autoshrink', N'false'
GO
exec sp_dboption N'Logging', N'ANSI null default', N'false'
GO
exec sp_dboption N'Logging', N'recursive triggers', N'false'
GO
exec sp_dboption N'Logging', N'ANSI nulls', N'false'
GO
exec sp_dboption N'Logging', N'concat null yields null', N'false'
GO
exec sp_dboption N'Logging', N'cursor close on commit', N'false'
GO
exec sp_dboption N'Logging', N'default to local cursor', N'false'
GO
exec sp_dboption N'Logging', N'quoted identifier', N'false'
GO
exec sp_dboption N'Logging', N'ANSI warnings', N'false'
GO
exec sp_dboption N'Logging', N'auto create statistics', N'true'
GO
exec sp_dboption N'Logging', N'auto update statistics', N'true'
GO
use[Logging]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM dbo.sysobjects WHERE id =OBJECT_ID(N'[dbo].[Category]') ANDOBJECTPROPERTY(id, N'IsUserTable') =1)
BEGIN
CREATETABLE[dbo].[Category](
[CategoryID][int]IDENTITY(1,1) NOTNULL,
[CategoryName][nvarchar](64) NOTNULL,
CONSTRAINT[PK_Categories]PRIMARYKEYCLUSTERED
(
[CategoryID]ASC
) ON[PRIMARY]
) ON[PRIMARY]
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM dbo.sysobjects WHERE id =OBJECT_ID(N'[dbo].[CategoryLog]') ANDOBJECTPROPERTY(id, N'IsUserTable') =1)
BEGIN
CREATETABLE[dbo].[CategoryLog](
[CategoryLogID][int]IDENTITY(1,1) NOTNULL,
[CategoryID][int]NOTNULL,
[LogID][int]NOTNULL,
CONSTRAINT[PK_CategoryLog]PRIMARYKEYCLUSTERED
(
[CategoryLogID]ASC
) ON[PRIMARY]
) ON[PRIMARY]
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM dbo.sysobjects WHERE id =OBJECT_ID(N'[dbo].[Log]') ANDOBJECTPROPERTY(id, N'IsUserTable') =1)
BEGIN
CREATETABLE[dbo].[Log](
[LogID][int]IDENTITY(1,1) NOTNULL,
[EventID][int]NULL,
[Priority][int]NOTNULL,
[Severity][nvarchar](32) NOTNULL,
[Title][nvarchar](256) NOTNULL,
[Timestamp][datetime]NOTNULL,
[MachineName][nvarchar](32) NOTNULL,
[AppDomainName][nvarchar](512) NOTNULL,
[ProcessID][nvarchar](256) NOTNULL,
[ProcessName][nvarchar](512) NOTNULL,
[ThreadName][nvarchar](512) NULL,
[Win32ThreadId][nvarchar](128) NULL,
[Message][nvarchar](1500) NULL,
[FormattedMessage][ntext]NULL,
CONSTRAINT[PK_Log]PRIMARYKEYCLUSTERED
(
[LogID]ASC
) ON[PRIMARY]
) ON[PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM sysobjects WHERE id =OBJECT_ID(N'[dbo].[InsertCategoryLog]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement= N'CREATE PROCEDURE InsertCategoryLog
@CategoryID INT,
@LogID INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CatLogID INT
SELECT @CatLogID FROM CategoryLog WHERE CategoryID=@CategoryID and LogID = @LogID
IF @CatLogID IS NULL
BEGIN
INSERT INTO CategoryLog (CategoryID, LogID) VALUES(@CategoryID, @LogID)
RETURN @@IDENTITY
END
ELSE RETURN @CatLogID
END
'
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM sysobjects WHERE id =OBJECT_ID(N'[dbo].[AddCategory]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement= N'
CREATE PROCEDURE [dbo].[AddCategory]
-- Add the parameters for the function here
@CategoryName nvarchar(64),
@LogID int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CatID INT
SELECT @CatID = CategoryID FROM Category WHERE CategoryName = @CategoryName
IF @CatID IS NULL
BEGIN
INSERT INTO Category (CategoryName) VALUES(@CategoryName)
SELECT @CatID = @@IDENTITY
END
EXEC InsertCategoryLog @CatID, @LogID
RETURN @CatID
END
'
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM sysobjects WHERE id =OBJECT_ID(N'[dbo].[ClearLogs]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement= N'CREATE PROCEDURE ClearLogs
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM CategoryLog
DELETE FROM [Log]
DELETE FROM Category
END
'
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IFNOTEXISTS (SELECT*FROM sysobjects WHERE id =OBJECT_ID(N'[dbo].[WriteLog]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement= N'
/****** Object: Stored Procedure dbo.WriteLog Script Date: 10/1/2004 3:16:36 PM ******/
CREATE PROCEDURE [dbo].[WriteLog]
(
@EventID int,
@Priority int,
@Severity nvarchar(32),
@Title nvarchar(256),
@Timestamp datetime,
@MachineName nvarchar(32),
@AppDomainName nvarchar(512),
@ProcessID nvarchar(256),
@ProcessName nvarchar(512),
@ThreadName nvarchar(512),
@Win32ThreadId nvarchar(128),
@Message nvarchar(1500),
@FormattedMessage ntext,
@LogId int OUTPUT
)
AS
INSERT INTO [Log] (
EventID,
Priority,
Severity,
Title,
[Timestamp],
MachineName,
AppDomainName,
ProcessID,
ProcessName,
ThreadName,
Win32ThreadId,
Message,
FormattedMessage
)
VALUES (
@EventID,
@Priority,
@Severity,
@Title,
@Timestamp,
@MachineName,
@AppDomainName,
@ProcessID,
@ProcessName,
@ThreadName,
@Win32ThreadId,
@Message,
@FormattedMessage)
SET @LogID = @@IDENTITY
RETURN @LogID
'
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
IFNOTEXISTS (SELECT*FROM sysobjects WHERE id =OBJECT_ID(N'FK_CategoryLog_Category') AND parent_obj =OBJECT_ID(N'[dbo].[CategoryLog]'))
ALTERTABLE[dbo].[CategoryLog]WITHCHECKADDCONSTRAINT[FK_CategoryLog_Category]FOREIGNKEY( [CategoryID])
REFERENCES[dbo].[Category] ( [CategoryID])
GO
IFNOTEXISTS (SELECT*FROM sysobjects WHERE id =OBJECT_ID(N'FK_CategoryLog_Log') AND parent_obj =OBJECT_ID(N'[dbo].[CategoryLog]'))
ALTERTABLE[dbo].[CategoryLog]WITHCHECKADDCONSTRAINT[FK_CategoryLog_Log]FOREIGNKEY( [LogID])
REFERENCES[dbo].[Log] ( [LogID])
GO
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF
go
DECLARE@bErrorsasbit
BEGINTRANSACTION
SET@bErrors=0
CREATENONCLUSTEREDINDEX[ixCategoryLog]ON[dbo].[CategoryLog] ([LogID]ASC, [CategoryID]ASC )
IF( @@error<>0 ) SET@bErrors=1
IF( @bErrors=0 )
COMMITTRANSACTION
ELSE
ROLLBACKTRANSACTION
2.
点击Logging
Target Listeners 区块右上角的加号按钮, Add Logging Target Listeners然后点击 Add Database Listeners ,属性设置如下:

3. File—Save,保存App.config,无需改动VS中的程序直接再次运行,运行结果如下:

4. 查看Logging数据库,可以看到刚刚写入的日志:
SELECT*FROM[Logging].[dbo].[Category]GOSELECT*FROM[Logging].[dbo].[Log]GO

三. 向XML文件写入日记
1. 创建一个XML文件,我建在上面创建好的工程目录下,命名为test.xml,点击Logging Target Listeners 区块右上角的加号按钮, Add Logging Target Listeners然后点击 Add XML Listeners ,属性设置如下:

2. File—Save,保存App.config,无需改动VS中的程序直接再次运行,运行结果如下:

3. 打开test.xml文件,内容如图所示:

哈哈.好了,今天的教程就做到这里,吃午餐~睡觉~下午上课去(最讨厌学校的实验课了)~
请输
黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block的更多相关文章
- Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
Download dll: http://www.microsoft.com/en-us/download/confirmation.aspx?id=15104 http://www.cnblogs. ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) Caching Application Bl ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) : Caching Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) : Caching Application Block (初级) 本篇文章具体官方解释请参照以下链接: h ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...
随机推荐
- 【Demo 0003】Java基础-数组
本章学习要点: 1. 了解数组的基本概念: 2. 掌握数组使用方法: 一.数组的基本概念 1. 数组定义: 同一数据类型数据的集合,在 ...
- Java调用cmd命令 打开一个站点
使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来 怕是忘记,须要时能 ...
- (step6.3.2)hdu 1068(Girls and Boys——二分图的最大独立集)
题目大意:第一行输入一个整数n,表示有n个节点.在接下来的n行中,每行的输入数据的格式是: 1: (2) 4 6 :表示编号为1的人认识2个人,他们分别是4.6: 求,最多能找到多少个人,他们互不认识 ...
- 深入理解 JBoss 7/WildFly Standalone 模式启动过程
概述 JBoss 7/WildFly Standalone 模式启动过程大致例如以下: 启动脚本 standalone.sh 启动 JBoss Modules,JBoss Modules 启动 JBo ...
- c# in depth 之泛型实参的类型推断
调用泛型方法时,指定类型实参常常会显得很多余.为简化工作,c#2编译器被赋予了一定的“智能”,让你在调用方法时,不需要显式声明类型实参. 在深入讨论这个主题之前,必须强调一下:类型推断只适用于泛型方法 ...
- shell 调试
感觉编写shell在查找错误的过程中,很让你崩溃,还好shell也提供了一些调试的方式: 语法检查 -n选项做语法检查,而不执行脚本 sh -n script_name.sh 启动 ...
- MySQL学习笔记之中的一个 MySQL入门
本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会非常费劲,在总结的时候可能很多其它的 ...
- jQuery遍历函数
jQuery遍历函数包含了用于筛选.查找和串联元素的方法. .add():将元素加入到匹配元素的集合中. .andSelf():把堆栈中之前的元素集加入到当前集合中. .children():获得匹配 ...
- 30分钟快速掌握AngularJs
[后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs 一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来 ...
- 深入 CSocket 编程之阻塞和非阻塞模式
有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...