Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block
2006-07-08 12:52:00
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://terrylee.blog.51cto.com/342737/67628 |
在本系列的技巧(1)和技巧(2)中分别介绍了使用外部配置文件,使用数据库记录配置信息两种方法,不知道大家有没有想过不使用任何配置文件,也不使用数据库而直接用编程的方法来实现呢?本文将会展示如何使用编程的方法来配置Logging Application Block。首先我们需要了解一下Logging Application Block中比较重要的几个对象:
1.LogFormatter
格式化对象,LogFormatter有TextFormatter和BinaryFormatter两种,多数情况下我们会使用TextFormatter,它通过一个Template来创建,一个完整的Template格式如下:
Timestamp: {timestamp}{newline}![]() Message: {message}{newline}![]() Category: {category}{newline}![]() Priority: {priority}{newline}![]() EventId: {eventid}{newline}![]() Severity: {severity}{newline}![]() Title:{title}{newline}![]() Machine: {machine}{newline}![]() Application Domain: {appDomain}{newline}![]() Process Id: {processId}{newline}![]() Process Name: {processName}{newline}![]() Win32 Thread Id: {win32ThreadId}{newline}![]() Thread Name: {threadName}{newline}![]() Extended Properties: {dictionary({key} - {value})}{newline}这里就不具体解释每一项的含义,大家可以参考有关文档,示例代码: const string Template = "Timestamp: {timestamp}{newline}" +![]() "Message: {message}{newline}" +![]() "Category: {category}{newline}" +![]() "Machine: {machine}{newline}";![]() TextFormatter formatter = new TextFormatter(Template);2.TraceListener
TraceListener提供了日志记录服务,它指定的是日志将被记录到何处,数据库中或者是文本文件,Enterprise Library提供了7种 TraceListener:Database TraceListener、Email TraceListener、Flat File TraceListener、Formatter Event Log TraceListener、Msmq TraceListener、System Diagnostics TraceListener、WMI Trace Listener。每一种TraceListener都需要一个LogFormatter来对记录的信息进行格式化,例如创建一个FlatFileTraceListener实例:
const string LogFilePath = @"d:\\share\\messages.log";![]() FlatFileTraceListener logFileListener =![]() new FlatFileTraceListener(LogFilePath,![]() "----------",![]() "----------",![]() formatter);这里的formatter就是在上面创建的TextFormatter对象。
3.LogSource
LogSource其实就是TraceListener的集合,Enterprise Library允许针对不同的日志信息记录到不同地方,因此可以在LogSource中加入多个TraceListener:
LogSource mainLogSource =![]() new LogSource("MainLogSource", SourceLevels.All);![]() mainLogSource.Listeners.Add(logFileListener);4.LogFilter
过滤器,对日志信息进行过滤,Enterprise Library默认提供了三种过滤器,用户也可以定义自己的过滤器,示例代码:
// 创建一个类别过滤器![]() ICollection<string> categoryfilters = new List<string>();![]() categoryfilters.Add(DebugCategory);![]() CategoryFilter categoryFilter = new CategoryFilter("CategoryFilter", categoryfilters, CategoryFilterMode.AllowAllExceptDenied);![]() ![]() // 加入类别过滤器到集合中![]() ICollection<ILogFilter> filters = new List<ILogFilter>();了解了这四个对象,其实我们就已经知道了该如何去用编程的方法配置Logging Application Block,下面给出一个简单的例子,先写一个MyLogger静态类:
using System;![]() using System.Collections.Generic;![]() using System.Diagnostics;![]() using Microsoft.Practices.EnterpriseLibrary.Logging;![]() using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;![]() using Microsoft.Practices.EnterpriseLibrary.Logging.Filters;![]() using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;![]() using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;![]() public static class MyLogger![]() {![]() static readonly LogWriter _writer;![]() ![]() // 日至记录的类别![]() const string ErrorCategory = "Error";![]() const string DebugCategory = "Debug";![]() ![]() // 文本文件的路径![]() const string LogFilePath = @"d:\\share\\messages.log";![]() ![]() // 模版![]() const string Template = "Timestamp: {timestamp}{newline}" +![]() "Message: {message}{newline}" +![]() "Category: {category}{newline}" +![]() "Machine: {machine}{newline}";![]() static MyLogger()![]() {![]() // 实例化一个TextFormatter,使用前面定义的模版![]() TextFormatter formatter = new TextFormatter![]() (Template);![]() ![]() // 实例化TraceListener,记录到文本文件用FlatFileTraceListener![]() FlatFileTraceListener logFileListener =![]() new FlatFileTraceListener(LogFilePath,![]() "----------",![]() "----------",![]() formatter);![]() ![]() // 这里是TraceListener的集合,可以增加多个![]() LogSource mainLogSource =![]() new LogSource("MainLogSource", SourceLevels.All);![]() mainLogSource.Listeners.Add(logFileListener);![]() IDictionary<string, LogSource> traceSources = new Dictionary<string, LogSource>();![]() traceSources.Add(ErrorCategory, mainLogSource);![]() traceSources.Add(DebugCategory, mainLogSource);![]() // 用来表示不记录日志,这点需要注意一下![]() LogSource nonExistantLogSource = new LogSource("Empty");![]() ![]() // 创建一个类别过滤器![]() ICollection<string> categoryfilters = new List<string>();![]() categoryfilters.Add(DebugCategory);![]() CategoryFilter categoryFilter = new CategoryFilter("CategoryFilter", categoryfilters, CategoryFilterMode.AllowAllExceptDenied);![]() ![]() // 加入类别过滤器到集合中![]() ICollection<ILogFilter> filters = new List<ILogFilter>();![]() filters.Add(categoryFilter);![]() ![]() _writer = new LogWriter(filters,![]() traceSources,![]() nonExistantLogSource,![]() nonExistantLogSource,![]() mainLogSource,![]() ErrorCategory,![]() false,![]() true);![]() }![]() /// <summary>![]() /// 记录日志信息到Error,默认类别![]() /// </summary>![]() /// <param name="message">日志信息</param>![]() public static void Write(string message)![]() {![]() Write(message, ErrorCategory);![]() }![]() /// <summary>![]() /// 记录日志信息到特定类别![]() /// </summary>![]() /// <param name="message">日志信息</param>![]() /// <param name="category">类别</param>![]() public static void Write(string message, string category)![]() {![]() LogEntry entry = new LogEntry();![]() ![]() entry.Categories.Add(category);![]() entry.Message = message;![]() ![]() _writer.Write(entry);![]() }![]() }我们再来写一个简单的测试,注意上面的代码中我们过滤掉了Debug类别的日志信息,这样记录到文本文件中的日志信息应该只有My Error一条:
public partial class _Default : System.Web.UI.Page ![]() {![]() protected void Page_Load(object sender, EventArgs e)![]() {![]() MyLogger.Write("My Error");![]() MyLogger.Write("My Debug", "Debug");![]() }![]() }文本文件中输出的结果为:
----------
Timestamp: 2006-7-8 3:45:05
Message: My Error
Category: Error
Machine: RJ-097
----------
输出的结果与我们设想的一致,使用编程的方法配置Logging Application Block简单的就介绍到这里,你也可以使用这种方法来配置其他的应用程序块。不过使用编程的方法来配置,失去了EL的灵活性,要知道EL的根本思想就是配置驱动,但是如果掌握了这些,也许你能够更好的使用EL,在CodeProject上有人写了一篇《Plug-in Manager for Logging - Configure MSEL2 On the fly》,有兴趣的朋友不妨参考一下。 本文出自 “TerryLee技术专栏” 博客,请务必保留此出处http://terrylee.blog.51cto.com/342737/67628 本文出自 51CTO.COM技术博客 |









}
}
lihuijun
博客统计信息
热门文章
最新评论
友情链接
