黄聪: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文件中寫入程序操作日記:
?
一.? 向日志文件寫入日記
?
?
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,
1701699287,
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文件,內容如圖所示:
?
哈哈.好了,今天的教程就做到這里,吃午餐~睡覺~下午上課去(最討厭學校的實驗課了)~
請輸
?
總結
以上是生活随笔為你收集整理的黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript常用技巧
- 下一篇: 笔记本内置扬声器三强PK