企业库日志应用程序模块工作原理图:


从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中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文件中写入程序操作日记:


一.  向日志文件写入日记

  1. 运行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
{
static void Main(string[] args)
{
LogEntry logEntry = new LogEntry();

logEntry.EventId = 1;
logEntry.Priority = 1;
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中运行也可以:

Logging数据库创建SQL

/****** Object: Database Logging Script Date: 8/22/2005 ******/

USE [master]

GO

IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'Logging')

DROP DATABASE [Logging]

GO

CREATE DATABASE [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

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Category]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)

BEGIN

CREATE TABLE [dbo].[Category](

[CategoryID] [int] IDENTITY(1,1) NOT NULL,

[CategoryName] [nvarchar](64) NOT NULL,

CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED

(

[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

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[CategoryLog]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)

BEGIN

CREATE TABLE [dbo].[CategoryLog](

[CategoryLogID] [int] IDENTITY(1,1) NOT NULL,

[CategoryID] [int] NOT NULL,

[LogID] [int] NOT NULL,

CONSTRAINT [PK_CategoryLog] PRIMARY KEY CLUSTERED

(

[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

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Log]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)

BEGIN

CREATE TABLE [dbo].[Log](

[LogID] [int] IDENTITY(1,1) NOT NULL,

[EventID] [int] NULL,

[Priority] [int] NOT NULL,

[Severity] [nvarchar](32) NOT NULL,

[Title] [nvarchar](256) NOT NULL,

[Timestamp] [datetime] NOT NULL,

[MachineName] [nvarchar](32) NOT NULL,

[AppDomainName] [nvarchar](512) NOT NULL,

[ProcessID] [nvarchar](256) NOT NULL,

[ProcessName] [nvarchar](512) NOT NULL,

[ThreadName] [nvarchar](512) NULL,

[Win32ThreadId] [nvarchar](128) NULL,

[Message] [nvarchar](1500) NULL,

[FormattedMessage] [ntext] NULL,

CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED

(

[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

IF NOT EXISTS (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

IF NOT EXISTS (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

IF NOT EXISTS (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

IF NOT EXISTS (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

IF NOT EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'FK_CategoryLog_Category') AND parent_obj = OBJECT_ID(N'[dbo].[CategoryLog]'))

ALTER TABLE [dbo].[CategoryLog] WITH CHECK ADD CONSTRAINT [FK_CategoryLog_Category] FOREIGN KEY( [CategoryID])

REFERENCES [dbo].[Category] ( [CategoryID])

GO

IF NOT EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'FK_CategoryLog_Log') AND parent_obj = OBJECT_ID(N'[dbo].[CategoryLog]'))

ALTER TABLE [dbo].[CategoryLog] WITH CHECK ADD CONSTRAINT [FK_CategoryLog_Log] FOREIGN KEY( [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 @bErrors as bit

BEGIN TRANSACTION

SET @bErrors = 0

CREATE NONCLUSTERED INDEX [ixCategoryLog] ON [dbo].[CategoryLog] ([LogID] ASC, [CategoryID] ASC )

IF( @@error <> 0 ) SET @bErrors = 1

IF( @bErrors = 0 )

COMMIT TRANSACTION

ELSE

ROLLBACK TRANSACTION

2. 点击Logging Target Listeners 区块右上角的加号按钮, Add Logging Target Listeners然后点击 Add Database Listeners ,属性设置如下:

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

4. 查看Logging数据库,可以看到刚刚写入的日志:

SELECT * FROM [Logging].[dbo].[Category]
GO
SELECT * 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文件,内容如图所示:

哈哈.好了,今天的教程就做到这里,吃午餐~睡觉~下午上课去(最讨厌学校的实验课了)~

请输入

出处:http://www.cnblogs.com/huangcong/archive/2010/05/31/1748672.html 请输
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Microsoft Enterprise Library 5.0 系列(四) Logging Application Block相关推荐

  1. Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)

    企业库加密应用程序模块提供了2种方式让用户保护自己的数据: Hashingproviders:  离散加密法, 简单来说就是把你的信息保存到内存中后用一个离散值表示并返回给程序,这样在程序中只能看到离 ...

  2. Microsoft Enterprise Library 5.0 系列(十) Configuration Application Block

    到目前为止,我们使用的模块都是在同一个配置文件中,这显然是不灵活的,我们希望每个功能模块能独立的在一个配置文件中体现,这样不仅易于管理,易于扩展,也易于阅读和分类.企业库当然考虑到了这个问题并且提供了 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 原文:黄聪:Microsoft Ent ...

  4. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  5. Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    企业库加密应用程序模块提供了2种方式让用户保护自己的数据: Hashingproviders:  离散加密法, 简单来说就是把你的信息保存到内存中后用一个离散值表示并返回给程序,这样在程序中只能看到离 ...

  6. Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block

    企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演 ...

  7. 黄聪mysql_黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Acc

    企业库数据库访问模块通过抽象工厂模式 , 允许用户通过简单的配置选择不同的数据库作为程序的数据源 , 大大解决了切换数据库时带来的麻烦 . 因为我本机只安装了 SQL Server 2005, 所以在 ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    企业库日志应用程序模块工作原理图:   从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中.整个流程如图: 我个人对Policy Injectio ...

最新文章

  1. 驰骋工作流引擎设计系列04 流程引擎表结构的设计
  2. NumPy的思考……
  3. c语言和plc编程,PLC编程C语言.ppt
  4. emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全
  5. 前台提交数据到php mysql,建立一个基础的MySQL数据库,使用PHP来抓取和处理数据,并抛出给前台...
  6. 应用容器公共免费部署平台
  7. windows下安装mysql教程
  8. 北京智控美信(长春)数据中心应聘总结
  9. catti二级笔译综合能力真题_CATTI 二级口笔译教材、真题和模拟试题汇总!
  10. Unity3D之如何创建正确的像素比在屏幕上
  11. 程序员正在抛弃 Facebook
  12. 快递柜模拟程序【感知与控制】
  13. Hyper-V虚拟化——在Hyper-V上创建虚拟服务器
  14. COSTDOWN版本的NRF51802和NRF51822的复位问题
  15. 软件测试需要学习哪些技能?
  16. MOBLIN SDK项目和目标:使用映像创建者
  17. 浅谈Android性能优化方案
  18. 利用傅里叶变换获取低频和高频部分图像
  19. MATLAB颜色图中,小于某个值的所有点设为白色
  20. 启发式算法求解混合整数线性优化问题—— 生产计划安排和资源分配

热门文章

  1. 信息学奥赛一本通 1002:输出第二个整数 | OpenJudge NOI 1.1 02
  2. 重排列得到2的幂(51Nod-2515)
  3. 图论 —— 二分图 —— 匈牙利算法
  4. 方格取数(信息学奥赛一本通-T1277)
  5. Written English-书面-一般将来时
  6. InceptionNet V3整理总结
  7. linux那些事之early pape fault
  8. python作业表达式求值_用Python3实现表达式求值
  9. C++轻量级微服务_微服务技术栈:API网关中心,落地实现方案
  10. 一副眼镜一千多贵吗_成都配眼镜去哪里好一点?怎样配眼镜才不被坑