• Enterprise Library 2.0 技巧(4):如何用编程的方法来配置Logging Application Block


    在本系列的技巧(1技巧(2中分别介绍了使用外部配置文件,使用数据库记录配置信息两种方法,不知道大家有没有想过不使用任何配置文件,也不使用数据库而直接用编程的方法来实现呢?本文将会展示如何使用编程的方法来配置Logging Application Block。首先我们需要了解一下Logging Application Block中比较重要的几个对象:

    1LogFormatter

    格式化对象,LogFormatterTextFormatterBinaryFormatter两种,多数情况下我们会使用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);

    2TraceListener
    TraceListener提供了日志记录服务,它指定的是日志将被记录到何处,数据库中或者是文本文件,Enterprise Library提供了7

    TraceListenerDatabase 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对象。

    3LogSource

    LogSource其实就是TraceListener的集合,Enterprise Library允许针对不同的日志信息记录到不同地方,因此可以在LogSource中加入多个TraceListener

    LogSource mainLogSource =

                
    new LogSource("MainLogSource", SourceLevels.All);

            mainLogSource.Listeners.Add(logFileListener);

    4LogFilter

    过滤器,对日志信息进行过滤,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

  • 相关阅读:
    08-图9 关键活动 (30 分)
    08-图8 How Long Does It Take (25 分)
    08-图7 公路村村通 (30 分)
    07-图6 旅游规划 (25 分)
    07-图5 Saving James Bond
    使用RichTextBox控件保存文件
    在RichTextBox控件中显示RTF格式文件
    在RichTextBox控件中插入图片
    在RichTextBox控件中添加超链接文本
    实现带查询功能的ComboBox控件
  • 原文地址:https://www.cnblogs.com/Terrylee/p/enterprise_library2_4.html
Copyright © 2020-2023  润新知