在本系列的技巧(1)和技巧(2)中分别介绍了使用外部配置文件,使用数据库记录配置信息两种方法,不知道大家有没有想过不使用任何配置文件,也不使用数据库而直接用编程的方法来实现呢?本文将会展示如何使用编程的方法来配置Logging Application Block。
主要内容
1.几个重要的对象
2.示例代码
在本系列的技巧(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》,有兴趣的朋友不妨参考一下。
参考:
http://davidhayden.com/blog/dave/archive/2006/02/18/2805.aspx
http://geekswithblogs.net/akraus1/archive/2006/02/16/69784.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)