zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/Terrylee/p/enterprise_library2_4.html
Copyright © 2011-2022 走看看