黄聪: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文件中写入程序操作日记:

 

一.  向日志文件写入日记

  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
{
staticvoid 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



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]
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.mzph.cn/news/304149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Webapi测试工具WebBenchmark v1.3发布

这个版本更新的内容是统一使用BeetleX的Web SPA 插件作为服务的基础支持功能方便后期功能扩展&#xff0c;修复线程池配置太小引起的测试问题&#xff0c;修复统计显示的BUG。安装工具提供win64和linux64两个版本&#xff0c;可以根据自己需要下载对应系统的运行版本。地址是:h…

详解哈希表的查找

哈希表和哈希函数在记录的存储位置和它的关键字之间是建立一个确定的对应关系&#xff08;映射函数&#xff09;&#xff0c;使每个关键字和一个存储位置能唯一对应。这个映射函数称为哈希函数&#xff0c;根据这个原则建立的表称为哈希表(Hash Table)&#xff0c;也叫散列表。…

微软腾讯京东都在高薪招.NET Core,你准备好了吗!

金三银四跳槽季&#xff0c;古人诚不我欺&#xff0c;2年没更新简历了&#xff0c;还接到好几个电话邀约&#xff0c;打过交道的几个猎头妹子更是殷勤的频繁打招呼。认真了解一下才知道&#xff0c;今年的招聘真的很热&#xff0c;.NET招聘真的很热。头部互联网企业像微软苏州、…

.NET Core dump 分析

服务 CPU 或 内存偶尔飙高是部署环境中经常遇到的问题&#xff0c;一般会采用记录日志的方式来诊断&#xff0c;不过有些情况靠日志可能并不能分析出个所以然&#xff0c;面对实在无头绪的问题也只能暂时使用重启大法先恢复。为了尽可能精准的定位问题&#xff0c;掌握通过 dum…

外国人最常说的100个“中国词”出炉,第一个你绝对想不到…

近几年&#xff0c;“汉语热”在全球兴起&#xff0c;外国人说的念的中国词儿变多了&#xff01;那外国人最常说的、最热的“中国词”到底是啥呢&#xff1f;2月17日&#xff0c;中国外文局首次发布《中国话语海外认知度调研报告》。报告显示&#xff0c;近两年中国话语以汉语拼…

python 什么可以作为变量名_为什么强烈禁止开发人员使用isSuccess作为变量名

在日常开发中&#xff0c;我们会经常要在类中定义布尔类型的变量&#xff0c;比如在给外部系统提供一个RPC接口的时候&#xff0c;我们一般会定义一个字段表示本次请求是否成功的。关于这个”本次请求是否成功”的字段的定义&#xff0c;其实是有很多种讲究和坑的&#xff0c;稍…

自建Git服务器系列——Gitea(Gogs的孪生兄弟)

概述该项目的目标是提供一种最简单&#xff0c;最快&#xff0c;最轻松的方式来建立自托管的Git服务。使用Go&#xff0c;可以在Go支持的所有平台上进行独立的二进制分发 &#xff0c;包括x86&#xff0c;amd64&#xff0c;ARM和PowerPC体系结构上的Linux&#xff0c;macOS和Wi…

干货|吴恩达Coursera课程教你学习神经网络!

吴恩达Coursera机器学习课程系列笔记讲解课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础干货|机器学习零基础&#xff1f;不要怕&#xff0c;吴恩达机器学习课程笔记2-多元线性回归干货|机器学习零基础&#xff1f;不要怕&#xff0c;吴恩达课程笔记第三周&#xff…

笔记本内置扬声器三强PK

内置扬声器PK要点外观设计差异。外表是否美观直接影响使用者的心情&#xff0c;扬声器的结构设计直接影响放音效果。实际听音较量。利用真实的人耳感受则是最能体现扬声器实际效果的。奥特蓝星&#xff1a;音质纯净&#xff0c;低音欠佳代表机型&#xff1a;惠普&#xff0c;华…

mysql内连接查询原理_MySQL全面瓦解12:连接查询的原理和应用

概述MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表。大部分的单表数据查询并不能满足我们的需求&#xff0c;这时候我们就需要连接一个或者多个表&#xff0c;并通过一些条件过滤筛选出我们需要的数据。了解MySQL连接查询之前我们先来理解下笛卡尔积的原理。数据…

如何在 .NET 中使用 Kafka

Kafka 是一个开源的&#xff0c;分布式的&#xff0c;可扩展的&#xff0c;高性能的发布订阅模式的消息中间件&#xff0c;如果你要构建一个处理海量数据的系统&#xff0c;那么 Kafka 将会是一个非常好的选择&#xff0c;这篇文章我们将会讨论如何基于 Kakfa 构建一个发布订阅…

傅里叶变换和拉普拉斯变换的物理解释及区别

傅里叶变换在物理学、数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用&#xff08;例如在信号处理中&#xff0c;傅里叶变换的典型用途是将信号分解成幅值分量和频率分量&#xff09;。傅里叶变换能将满足一定条件的…

Teleport 开源堡垒机的使用

公司的服务器可能会存在这样一种情况&#xff0c;具体的应用是部署在一个或多个内网服务器上&#xff0c;然后由一台外网服务器通过代理的方式对外提供服务&#xff0c;例如下图&#xff1a;我们如果需要进入到内网服务器进行操作就必须先要进入外网服务器&#xff0c;然后再远…

python拼图游戏_乐趣无穷的Python课堂

Python world/特慧编/你所认为的.........pythonpython&枯燥、无趣boring“安全”提示走进特慧编走进“python编程课”让我们进入真正的编程世界&#xff0c;培养逻辑数理思维&#xff0c;学习掌握python特色&#xff0c;让你的学习过程不再枯燥、不再无趣~~~下面跟着我的脚…

让 Python 更加充分的使用 Sqlite3

我最近在涉及大量数据处理的项目中频繁使用 sqlite3。我最初的尝试根本不涉及任何数据库&#xff0c;所有的数据都将保存在内存中&#xff0c;包括字典查找、迭代和条件等查询。这很好&#xff0c;但可以放入内存的只有那么多&#xff0c;并且将数据从磁盘重新生成或加载到内存…

techempower之Plaintext上7百万RPS

在Plaintext这项测试中第一阶梯的分隔线基本算是7百万RPS&#xff0c;Beetlex并没有到到这一阶梯停留在69X万RPS处&#xff0c;虽然只差那数万但在排名上让人感觉不爽。Beetlex在很多项测都微微领先aspcore,但在最基础项落下一点点的确让我感觉到不太满意&#xff0c;更希望Bee…

详解全排列算法

简介给定 {1, 2, 3, , , n}&#xff0c;其全排列为 n! 个&#xff0c;这是最基础的高中组合数学知识。我们以 n4 为例&#xff0c;其全部排列如下图&#xff08;以字典序树形式来呈现&#xff09;&#xff1a;我们很容易想到用递归来求出它的所有全排列。仔细观察上图&#xff…

VS2019 调试技巧之附加进程

C# 创建服务并附加到进程进行调试步骤一&#xff1a;在任务栏右键-》》点击任务管理器-》》选择服务&#xff0c;找到启动的进程PID或者WINR 进入cmd命令 输入 netstat -ano | find "进程端口" 找端口步骤二&#xff1a;VS中找到“调试”菜单&#xff0c;选择“…

sql同时向两个表插入数据_SQL入门-数据库和客户端的安装,表的创建和数据插入...

1、如何验证MySQL数据库安装成功按照上图操作打开SQL命令行客户端输入安装MySQL时设置的密码并按enter键&#xff0c;得到下图&#xff1a;如果有显示出来红框里的内容&#xff0c;就表示安装成功。红框里的内容表示的是MySQL数据库版本号。2、如何用客户端&#xff08;Navicat…

我是怎么进入Oracle这样的大企业的?

导语&#xff1a;人工智能是泡沫么&#xff1f;AI产业的未来将何去何从&#xff1f;机器学习又该怎么学习&#xff1f;AI行业从业者又是怎么看待这个行业的呢&#xff1f;踏入一个行业之前最好对这个行业有个全方位的了解。本文作者饶毅&#xff0c;现就职于甲骨文公司。AI行业…