EntLib 3.1学习笔记(4) : Logging Application Block

2023-05-16

 



[zh] http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2logging.mspx?mfr=true
[en] http://msdn2.microsoft.com/en-us/library/ms998162.aspx

    开发人员经常编写需要日志和规范功能的应用程序。通常,这些应用程序必须适当地格式化事件和记录事件,不论是在本地还是通过网络。在某些情况下,您可能需要对一台计算机上来自多个源的事件进行整理。

    日志应用程序块通过收集应用程序需要包含的多个最常见的日志和规范任务来简化应用程序的开发。每个任务都以一致的方式处理,并从特定的日志和规范提供程序中抽象应用程序代码。体系结构模型可让您通过更改配置来更改基础事件接收器和格式化程序,而无需更改应用程序代码。

1.应用程序可以使用日志块在多个位置记录事件:
(1) 事件日志
(2) 电子邮件
(3) 数据库
(4) 消息队列
(5) 文件
(6) WMI

2. 使用
(0) EntLib配置工具配置App.config/Web.config,New->Logging Application Block:
    a. 创建或定制Formatter(默认只有一个Text Formatter,我们可以定制其Template);
    b. 创建或定制Trace Listeners(默认只有一个Fomatted EventLog TraceListener,其可以将日志记录在系统日志中),并为其指定一个Formatter(上一步a中定义了的Formatter);不同的Trace Listener记录事件的位置(Email、EventLog、File、DB、MSMQ、WMI)不同
    c. 创建Category Source(默认只有一个General Category,其使用EventLog TraceListener将日志记录在系统日志中),并为其指定Trace Listener(上一步b中定义了的Trace Listener).
   
(1) 记录日志:

None.gif LogEntry log  =   new  LogEntry();
None.giflog.EventId 
=   300 ;
None.giflog.Message 
=   " Sample message " ;
None.giflogEntry.Categories.Clear();
None.giflog.Categories.Add(
" CategoryName " ); // 参数为上面步骤c中定义的Category.Name,可以Add多个Category
None.gif
log.Severity  =  TraceEventType.Information;
None.giflog.Priority 
=   5 ;
None.gifLogger.Write(log);


(2) 日志里面包含名-值对的字典

None.gif Dictionary < string object >  dictionary  =   new  Dictionary < string object > (); 
None.gifManagedSecurityContextInformationProvider informationHelper 
=   new  ManagedSecurityContextInformationProvider();
None.gifinformationHelper.PopulateDictionary(dictionary);
None.gifdictionary.Add(
" logInforName " , strLogInfor);
None.gifLogger.Write(
" Log entry with extra information " , dictionary); // 使用默认的Genera Category,记录事件到系统日志中
None.gif


(3) 跟踪活动并记录上下文信息
    LAB支持通过活动ID来跟踪一项活动,活动ID可以在代码中指定,也可以通过程序块来自动生成,LAB自动记录活动的起始时间和结束时间:

None.gif using  ( new  Tracer( " Category1 " ))
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif       
using (new Tracer("Category2"))
ExpandedSubBlockStart.gifContractedSubBlock.gif       
dot.gif{
InBlock.gif  LogEntry logEntry 
= new LogEntry();
InBlock.gif  
//给LogEntry的属性赋值
InBlock.gif
                Logger.Write(logEntry);//此时,logEntry会写5条日志:
InBlock.gif  
//1. Start Trace: Activity 'ActivityID' dot.gif.. at .. ticks
InBlock.gif  
//   Category: Category1
InBlock.gif  
//2. Start Trace: Activity 'ActivityID(同上)'dot.gif.. at .. ticks
InBlock.gif  
//   Category: Category2, Category1
InBlock.gif  
//3. Simulated General dot.gif..Activity='ActivityID(同上)'
InBlock.gif  
//   Category: General, Category2, Category1
InBlock.gif  
//4. End Trace: Activity 'ActivityID(同上)'dot.gifdot.gif at dot.gif ticks
InBlock.gif  
//   Category: Category2, Category1
InBlock.gif  
//5. End Trace: Activity 'ActivityID(同上)'dot.gifdot.gif at dot.gif ticks
InBlock.gif  
//   Category: Category1
ExpandedSubBlockEnd.gif
       }

ExpandedBlockEnd.gif}

(4) 创建过滤事件
Filters->New->可以创建Category Filter/Custom Filter/LogEnabled Filter/Priority Filter
Category Filter:根据Category的类别进行过滤(Deny all except: someCategory);
Priority Filter:只记录优先级在MinimumPriority和MaxmumPriority之间的事件;
LogEnabled Filter:记录(Enabled=true)或不记录(Enabled=false)所有的LogEntry。

None.gif if  (Logger.GetFilter < LogEnabledFilter > ().Enabled)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
// Logging is enabled.
ExpandedBlockEnd.gif
}

None.gif
else
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
// Logging is not enabled.
ExpandedBlockEnd.gif
}

None.gif
None.gif
if  (Logger.GetFilter < CategoryFilter > ().ShouldLog(categories)) // ICollection<string> categories;
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
// Event will be logged.
ExpandedBlockEnd.gif
}

None.gif
else
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
// Event will not be logged.
ExpandedBlockEnd.gif
}

None.gif
None.gif
if  (Logger.GetFilter < PriorityFilter > ().ShouldLog(priority)) // int priority;
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
// Event will be logged.
ExpandedBlockEnd.gif
}

None.gif
else
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     
// Event will not be logged.
ExpandedBlockEnd.gif
}

None.gif
None.gif
if  (Logger.ShouldLog(logEntry)) // 汇总上面的过滤结果,判断是否应该过滤掉该事件
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// Perform possibly expensive operations gather information for the event to be logged.
ExpandedBlockEnd.gif
}

None.gif
else
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// Event will not be logged.
ExpandedBlockEnd.gif
}



3. Logging Application Block的设计:



转载于:https://www.cnblogs.com/happyhippy/archive/2007/08/15/856159.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EntLib 3.1学习笔记(4) : Logging Application Block 的相关文章

  • zabbix-proxy安装

    注意 xff0c zabbix proxy的安装和zabbix server的安装不一样 不要混为一谈 xff0c 尤其是数据库的sql结构 rpm ivh http repo zabbix com zabbix 3 0 rhel 6 x8
  • konsole快捷键

    Tab xff1a 自动补全 Ctrl b xff1a 向前移动 xff0c 相当于 lt Left gt Ctrl f xff1a 向后移动 xff0c 相当于 lt Right gt Alt b xff1a 按词向前移动 Alt f x
  • docker中安装了RabbitMQ后无法访问其Web管理页面

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在官网找了 34 docker run d hostname my rabbit name some rabbit p 8080 15672 rabbitmq 3 mana
  • 网络数据包捕获函数库Libpcap安装与使用(非常强大)

    1 Libpcap简介 Libpcap是Packet Capture Libray的英文缩写 xff0c 即数据包捕获函数库 该库提供的C函数接口用于捕捉经过指定网络接口的数据包 xff0c 该接口应该是被设为混杂模式 这个在原始套接子中有
  • STM32F103控制两个步进电机按照一定转速比运动

    这个暑假没有回家 xff0c 在学校准备九月份的电子设计竞赛 今天想给大家分享一下STM32定时器控制两个步进电机按照一定速度比转动的问题 这次做的05年的电子设计竞赛题目 xff0c 运动悬挂系统 本实验是控制两个步进电机通过一个定滑轮用
  • Android 编程下的 Secret Code

    我们很多人应该都做过这样的操作 xff0c 打开拨号键盘输入 4636 等字符就会弹出一个界面显示手机相关的一些信息 xff0c 这个功能在 Android 中被称为 Android Secret Code xff0c 除了这些系统预置的
  • 用vim格式化代码

    格式化全文 xff1a gg 61 G 自动缩进当前行 xff1a 61 61 这个是原文节选 xff1a 14 6 How do I format indent an entire file You can format indent a
  • C# 之 反射性能优化3

    阅读目录 开始用Delegate优化反射的缺点用Delegate优化反射的优点用CodeDOM优化反射的优点如何用好CodeDOM xff1f 用CodeDOM优化反射的缺点能不能不使用委托 xff1f 根据反射密集程度选择优化方法Code
  • 基于用户行为的视频聚类方案

    在个性化推荐系统中 xff0c 通常是由挖掘物品属性来理解用户兴趣 xff0c 从而构建推荐模型 从用户行为去理解物品属性往往做得比较简单 xff0c 通常只是一些简单的标签统计 为了深入到用户行为去理解内容 xff0c 美拍利用用户的点击
  • .html文件调用接口示例

    直接在 html文件中请求接口的写法示例 span class hljs meta lt DOCTYPE html gt span span class hljs tag lt span class hljs name html span
  • mac os 环境下配置VMware Fusion虚拟机的互通网络

    安装环境 本文基于macOS Sierra 10 12 6系统为例 虚拟机应用VMware Fusion 10 1 3 系统Linux redhat 镜像rhel server 7 4 x86 64 dvd iso VMware Fusio
  • webpack的proxyTable无效的解决方案

    最近遇到这个需要单页访问跨域后台的问题 遇到了网上很多人说的 xff0c proxyTable无论如何修改 xff0c 都没效果的现象 经过几轮测试 xff0c 总结出一下几种解决方案 xff1a 1 xff08 非常重要 xff09 确保
  • 单个LottieAnimationView加载不同的lottie动画

    需求 最近做了一个单个LottieAnimationView根据用户点击选项的不同 xff0c 加载不同的lottie动画的需求 网上的一些demo和博客大多只是单独的加载一个lottie动画 xff0c 普遍不会有问题 xff0c 但是如
  • 使用element-ui中的table中的合计行的show-summary方法总结

    表尾结束景行统计的的问题 使用show summary 和 summary method 61 34 getSummaries 34 这两个方法搭配使用 逻辑处理 在最后必须使用return 出去就行 其中的逻辑可以自行定制 实现后达到的效
  • 如何下载网页所有资源(附源码)

    nodejs扒取html页面中所有链接资源 前言 xff1a 总有些人 xff0c 想下载一个插件 xff0c 能直接获取浏览器显示页面的所有资源 也就是下载一个其他人的网站 xff0c 但是不想一个个复制链接的内容 xff0c 原因大致有
  • Python 实现简单的登录注册界面

    Python 实现简单的登录注册界面 注意 xff1a 编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import messagebox 主要实现的功能 首先
  • VC窗口抖动源码

    窗口抖动实例 CPoint CurrentPos 抖完还要回到这个位置 xff0c 不要乱跑 CRect rect 这一段计算主要是为了满足SetWindowPos 的参数要求 不解释吧 GetClientRect amp rect Cli
  • Ubuntu编译驱动程序的准备(转)

    ubuntu不带linux内核源码 xff0c 需要自己下载安装 1 xff0c 查看自己的内核版本 uname r 2 xff0c 查看源内的内核源码类表 apt cache search linux source 3 xff0c 下载安
  • 树莓派练习程序(雨水检测)

    水滴检测模块如下 xff1a 树莓派的引脚如下图 xff1a 我们将Vcc引脚连接物理接口2 xff0c GND引脚连接物理接口39 xff0c DO引脚连接物理接口40 实物连接如下图 xff1a 编程使用WiringPi库 xff0c
  • 从C# 3.0说以人为本(三)—— 扩展方法

    说完了LINQ的语言支持和语法灵活 xff0c 下面就是一个非常有用的东东 扩展方法 xff08 Extension Method 还记得我们看了好几遍的LINQ吧 xff0c 下面这个 xff1a var numQuery 61 from

随机推荐