【IT168 技术文档】本文将会展示如何使用编程的方法来配置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}
这里就不具体解释每一项的含义,大家可以参考有关文档,示例代码:
2.TraceListenerconst string Template = "Timestamp: {timestamp}{newline}" +
"Message: {message}{newline}" +
"Category: {category}{newline}" +
"Machine: {machine}{newline}";
TextFormatter formatter = new TextFormatter(Template);
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实例:
这里的formatter就是在上面创建的TextFormatter对象。const string LogFilePath = @"d:\\share\\messages.log";
FlatFileTraceListener logFileListener =
new FlatFileTraceListener(LogFilePath,
"----------",
"----------",
formatter);
3.LogSource
LogSource其实就是TraceListener的集合,Enterprise Library允许针对不同的日志信息记录到不同地方,因此可以在LogSource中加入多个TraceListener:
LogSource mainLogSource = new LogSource("MainLogSource", SourceLevels.All);
![]()
mainLogSource.Listeners.Add(logFileListener);
4.LogFilter
过滤器,对日志信息进行过滤,Enterprise Library默认提供了三种过滤器,用户也可以定义自己的过滤器,示例代码:
了解了这四个对象,其实我们就已经知道了该如何去用编程的方法配置Logging Application Block,下面给出一个简单的例子,先写一个MyLogger静态类:// 创建一个类别过滤器
ICollection<string> categoryfilters = new List<string>();
categoryfilters.Add(DebugCategory);
![]()
CategoryFilter categoryFilter
= new CategoryFilter("CategoryFilter", categoryfilters, CategoryFilterMode.AllowAllExceptDenied);
![]()
// 加入类别过滤器到集合中
ICollection<ILogFilter> filters = new List<ILogFilter>();
我们再来写一个简单的测试,注意上面的代码中我们过滤掉了Debug类别的日志信息,这样记录到文本文件中的日志信息应该只有My Error一条: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);
}
}
文本文件中输出的结果为: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");
}
}
确 输出的结果与我们设想的一致,使用编程的方法配置Logging Application Block简单的就介绍到这里,你也可以使用这种方法来配置其他的应用程序块。不过使用编程的方法来配置,失去了EL的灵活性,要知道EL的根本思想就是配置驱动,但是如果掌握了这些,也许你能够更好的使用EL,在CodeProject上有人写了一篇《Plug-in Manager for Logging - Configure MSEL2 On the fly》----------
![]()
Timestamp: 2006-7-8 3:45:05
![]()
Message: My Error
![]()
Category: Error
![]()
Machine: RJ-097
![]()
----------
http://www.codeproject.com/useritems/Logging_Plug-in_Manager.asp
,有兴趣的朋友不妨参考一下。
