标题: Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block
- TerryLee 2006-07-08 12:52 阅读:4869
- 评论:17 查看评论 | 添加评论
在本系列的技巧(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实例:
这里的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一条: