zoukankan      html  css  js  c++  java
  • Enterprise Library 6——Using the Logging Application Block

    原文参考 http://msdn.microsoft.com/en-us/library/dn440731(v=pandp.60).aspx

    一、简介

    日志通常满足两个主要的要求:1、监控应用程序性能并提供信息。性能方面,日志可以监控程序内部发生了什么,有时也监控程序外部发生了什么。2、更重要的是用于审计。这种日志可以跟踪用户的行为并且记录用户执行的一系列任务、读取和修改的信息、访问的资源。

    日志模块是一个高灵活和可配置的解决方案,它允许以灵活多样的方式创建和存储日志信息于各种位置、分类并过滤信息、收集调试过程中的上下文信息、审计跟踪并记录。

    二、日志模块能做什么?

    日志模块可以使日志功能和应用程序代码分离。它可以把日志条目发送到Windows 事件日志、数据库、文本文件,也可以生成包含日志信息的邮件、windows消息队列等。也可以自定义发送目的。应用程序中,仅需简单地用合适的对象(如Logwriter)生成一个日志条目,然后调用其方法把日志条目写入相应的目标位置。

    1-An overview of the logging process and the objects in the Logging block

    三、日志的代价和额外的上下文信息

    无论怎样实现日志,它总会有一些性能影响。日志模块提供了灵活的、高度可配置的日志解决方案,并且经过精心设计来最小化性能影响。但是,你仍然需要知道这个影响,并且要考虑你的日志方案会如何影响它,需要在需求之间平衡。

    LogWriter自动收集一些像时间、应用程序、机器名字、进程ID等上下文信息。为了最小化性能影响,LogWriter类缓存了这些值并且采用了延迟最小化——即只有当被一个Listener实际使用时才去创建。
    然而,收集额外的上下文信息的代价是非常高的并且浪费宝贵的资源,这可能会影响性能。因此,在创建LogEntry时,只有指定需要某些不常用的信息时,日志模块才去收集。日志模块中的四个类可以收集指定的上下文信息,包括COM+、当前堆栈、运行时安全相关以及系统安全相关。LogEntry还有一个字典属性允许程序员添加信息。

    四、怎样使用Logging Block

    其中的关键是创建日志条目,然后调用方法把这个日志条目写入目标。

    1、添加LoggingBlock的引用到项目中

    需要添加的引用有Microsoft.Practices.EnterpriseLibrary. Logging.dll,如果日志要写入数据库还要引用 Microsoft.Practices.EnterpriseLibrary. Logging.Database.dll

    2、配置Loggin Block

    配置Logging Block可以用代码的方法,也可以用配置工具,这里介绍配置工具的方法。

    Step1启动配置工具。运行"EntLibConfig.exe",点击"File|Open"打开目标程序的配置文件(Web.configApp.config),打开文件后如图1

     

    1

    Step2配置。如果左边导航栏未出现"Logging Settings"节点则表明以前未进行过企业库日志相关的配置,此时点击"Blocks|Add Logging Settings",出现图2界面:

    2

    如果是修改配置请右击"Logging Settings"选择"Show/Hide Application Block Elements"(或点击前面的三角符号)也会出现上图。

    查看图2,先不要管"Logging Filters",界面被两条竖线划分成左中右三个区域,左边的是Category(日志类别),中间的是Listener(保存日志文件的载体),右边是Formatter(日志内容格式化器)。一个Category可以包含多个Listener,即一份日志可以写入多个载体中,一个Listener对应一个Formatter

    Logging Target Listener 保存日志的监听器,其中定义了日志保存的位置(日志载体):数据库、XML文件、FlatFile(文本文件)Windows事件等10个位置。点击"Logging Target Listeners"右方的"+"号,可以添加日志载体。日志载体可分为10种类型:

    Log Message Formatters日志内容格式器。用于设置日志的格式。每一个Listener需要设定唯一一个Formatters,一个Formatters可以被多个Listener使用。

    Categories分类。每一个分类都有一个名字,每一个分类中包含一个或者多个Listener。当调用LogWriter.Write()方法时,需要给该方法指定所使用的分类的名字(如果不指定分类的名字则使用默认分类)write方法根据分类的名字找到其中包含的Listener,把日志内容写到每一个Listener中,其内容根据Formatter进行格式设置。如果你的应用程序需要不同类型的日志信息,你可以定义多个分类,比如:应用程序警告可以定义一个分类,该分类中包含Windows Event Listener;而用户的所有操作信息写到文本文件中,这就需要定义另外一个分类,其中包含Flat File Listener

    五、使用LogWriter创建和写入日志条目

    1)使用LogWriterWrite方法时,首先获得一个LogWriter实例,获得该实例需要一个LoggingConfiguration对象作为参数。

    LoggingConfiguration loggingConfiguration = BuildProgrammaticConfig();

    LogWriter defaultWriter = new LogWriter(loggingConfiguration);

     

    2)或者用LogWriterFactory类来自动读取配置文件,然后创建实例

    LogWriterFactory logWriterFactory = new LogWriterFactory();
    
    LogWriter logWriter = logWriterFactory.Create();
    

    下面的几个例子演示了如何使用Write方法

    // Check if logging is enabled before creating log entries.
    if (defaultWriter.IsLoggingEnabled())
    
    {
    
      defaultWriter.Write("Log entry created using the simplest overload.");
    
      defaultWriter.Write("Log entry with a single category.", "General");
    
      defaultWriter.Write("Log entry with a category, priority, and event ID.",
    
    
    					"General", 6, 9001);
    
      defaultWriter.Write("Log entry with a category, priority, event ID, "
                          + "and severity.", "General", 5, 9002,
    
                          TraceEventType.Warning);
    
      defaultWriter.Write("Log entry with a category, priority, event ID, "
                          + "severity, and title.", "General", 8, 9003,
    
                          TraceEventType.Warning, "Logging Block Examples");
    
    }
    
    else
    {
    
      Console.WriteLine("Logging is disabled in the configuration.");
    
    }
    

    上面的内容对日志相关的基本知识和总体思路进行了说明。后面的部分会对涉及到的某些知识详细的介绍。

    六、Categories

    从该图可以看到,其需要设置的内容不多,Name:分类的名称。AutoFlush:设置为Ture时,每当调用Write()时,自动把日志信息写到目标;设置为Flase时,调用Write()时,日志仅仅写入缓存,当调用Listener的Flush方法时才写入目标。Listeners是该分类包含的目标监听器,可以根据需要添加多个监听器。

  • 相关阅读:
    django控制台输出sql日志
    Find概述
    命令大全
    京东智联云在 Serverless 的探索
    如何优雅地部署一个 Serverless Next.js 应用
    腾讯云 Serverless 保障《创造营》硬糖少女 C 位出道
    Serverless 应用实践及典型案例解析
    LeetCode 数组:62. 不同路径(动态规划 带记忆的递归)
    LeetCode 数组:56.合并区间(数组的自带排序函数 区间合并问题)
    LeetCode 数组:162. 寻找峰值(二分法)
  • 原文地址:https://www.cnblogs.com/liyanwei/p/3896625.html
Copyright © 2011-2022 走看看