log4net面面观之工作原理

要知道Log4net究竟是咋干活的,咱们可以从下面这个脉络简图入手。你的程序中的语句log4net.LogManager.GetLogger().Info(“hello world!”); 就会引发log4net如下内部工作流程。不要管上面的对象(Appender/Filter等等)是什么东东,先看着这个流程,我们来摸摸log4net工作的脉络,然后我们再按关节一一打通。



1.  第一件事就是找调度(LogManager)要个干活的工人(Logger,写日志的对象),当然,方法是调用LogManager.GetLogger()。找个什么样工人,究竟是那个工人会被挑中,这里面有些曲折,会涉及到Repository(高级话题,下回分解)。咱先不管这么多,知道有个能干活的工人(Logger) 肯定是被找来了。
    另外有些麻烦事儿,这工人有经纪人ILoggerWrapper(Logger需要实现ILogger, 而ILoggerWrapper唯一的方法就是得到ILogger实例),经纪人又有代理ILog(ILog继承于ILoggerWrapper)。代理ILog存在的意义在于给你提供方便的接口函数(Info,Warn等等),而不是工人提供的void Log(string callerFullName, Level level, object message, Exception t)。 不管关系多复杂,虽然你让干什么活都得先对代理说,但最后还都是告诉了工人,一个字也没落。

2.  你通过Info(“hello”)告诉工人干活了,工人Logger一定先看看这事能不能干。你的配置里说只写Info这个级别以上的信息,咱就不能写Debug和Warn。这种情况你需要付出性能代价(一个函数调用和一个整数形式的级别比较)。然后,工人Logger就创建一个任务包LoggingEvent,把你要做的事儿用任务包的形式包起来,以后的流程就都针对任务包LoggingEvent处理了。
    任务包LoggingEvent里信息丰富,包含:时间代码位置、工人的名字、信息、线程名、用户名、信息、异常、上下文等等。 

3.  接下来,Appender们登场了。原来工人自己不干具体的活,手里拽着一堆马仔,自己成了工头,告诉Appender去DoAppend(),让马仔们干活。注意,这里说得是“马仔们”,就是说同时会有多个马仔都在写东东。究竟那些马仔能被选中完成这光荣的任务,还要由客户您来决定,如:<appender-ref ref="ConsoleAppender" />
     这些马仔及其特长:     

马仔

特长

ConsoleAppender

在控制台上写日志

ColoredConsoleAppender

ConsoleAppender的徒弟,青出于蓝,写出来的东东还可以带颜色,花花绿绿的,煞是好看

FileAppender

往文件里写日志

RollingFileAppender

往可滚动的文件里写日志,就是说它会按客户要求控制文件大小和数量,一个文件写满就帮你再开另一个接着写

ForwardingAppender

帮其他Appender传任务包的人,当然自己可以干一点雁过拔毛的事(做一些过滤的事情,比如说你要写的东东里包含不雅的词汇,它可以让你变得文明一些)

NetSendAppender

往Windows的Messager写日志

ASPNetTraceAppender

在Asp.Net的Trace里写日志

ADONetAppender

往数据库里写日志

EventLogAppender

往Windows事件里写日志

RemotingAppender

把日志转给另外的Remoting服务,如:一个专门的集中的日志服务器

SmtpAppender

通过邮件把日志发出去

SmtpPickupDirAppender

把日志包成邮件,发在指定目录,等待专门的Smtp代理去发送

TelnetAppender

把日志发到Telnet控制台

UdpAppender

通过UDP协议把日志发给另外的一个主机,或者组播给一些主机

     当然,你可以自己搞个马仔,比如发个短信什么的,可以取名叫MobilePagerAppender(从AppenderSkeleton继承),通过配置告诉log4net就行。  

4.  说到这儿,检查员Filter登场。这活最终究竟干不干,马仔还得通过Decide()再问问检查员们。注意,这里说得是“检查员们”,就是说所有在册的检查员都点头,这话才能干。如何让检查员在册,看配置文件,如:
       <appender name="FF" type="log4net.Appender.ForwardingAppender" >
                     <filter type="log4net.Filter.LevelRangeFilter">
                            <param name="LevelMin" value="DEBUG"/>
                            <param name="LevelMax" value="INFO"/>
                     </filter>
                     <appender-ref ref="ConsoleAppender" />
      </appender>

    雁过拔毛的马仔ForwardingAppender和检查员LevelRangeFilter配合工作,把大于Debug和小于Info的东东通知给马仔ConsoleAppender,让它写到控制台上。

    每个检查员都有自己的关注点,如下: 

检查员

特长

LevelMatchFilter

日志级别等于指定的级别才放行

LevelRangeFilter

按日志级别范围做比较,可取区间内的放行。如必须大于Warn小于Info

StringMatchFilter

对你的言论进行检查,符合字符串比对条件的放行。如:必须包含“芝麻开门”的字符串才让写。

比对条件可以是简单的带通配符的字符串,也可以是正则表达式(帅!)

PropertyFilter

StringMatchFilter的徒弟,对LoggingEvent的某个属性进行检查,符合字符串匹配条件才放行

LoggerMatchFilter

检查工头(Logger)的名字,如果是以指定的字符串开头的才放行。如:只要是姓“张”的工头发下来的任务包,都让过。

DenyAllFilter

这个检查员最黑,什么都不让过

5.  检查员们点头后,这事就必须要干了。怎么干?客户要写的东东究竟用什么格式输出?这活由排版员Layout来干。下面是排版员的名单:

排版员

特长

ExceptionLayout

对LoggingEvent中的异常信息message进行排版

PatternLayout

最常用的排版员,通过一堆标识符来决定版式。

如:"%date %-5level- %message" 表示要以此输出日志日期、级别(5个字母的宽度)、信息

SimpleLayout

最简单的版式:  [level] - [message]

XmlLayout

把日志写到XML文件中去,写成一个Element

XmlLayoutSchemaLog4j

把日志写到XML文件中去,写成一个Element,其格式需符合log4j对事件定义的DTD.

    排版员需要排版LoggingEvent的信息的字符串内容RenderedMessage,例如文章开头的“hello world!”。除了“hello world!”这样的字符串,信息message还可以是任意的对象。因此需要针对对象进行专门的排版,由Render(对象打印机)来干。
    你可以针对自己的信息对象搞Render。如打印订单信息的OrderRenader,一旦在订单处理中发生错误,把订单的主要信息打印出来,方便调试。别忘了:OrderRenader必须实现log4net.ObjectRenderer.IObjectRenderer。 

6.  一切就绪,各个马仔就做最后的输出,有打印屏幕的,有写文件的,有在网络上发数据的,八仙过海,各显神通。 

    整个流程走完,相信我们接触到的Logger、Appender、Filter、Layout、Render都已不再陌生。log4net良好的实现了事件过滤、格式排版的高度扩展性和可配置性。
    log4net的这处理模式可以看作是一种扩展的Publish/Subscribe模式,完全可以应用到我们自己的应用程序中去,比如说订单处理,可以实现对不同订单的过滤,实现不同的订单的提交目的地(写数据库、发邮件、短信通知等等)。

    最后,给出Repository、Appender、Filter、Layout、Render的关系简图:
       

    虽然,Repository在下回分解,但这里还需要简单说两句。Repository可以说成基于一个log4net配置节创建的log4net容器,它根据log4net配置节的指示创建以上其他的对象并保有他们的实例,随时为你所用。一般而言,你的应用程序不需要关心它,用缺省的容器即可。

 
@Copyright, 251    zhangtao.it@gmail.comhttp://itrust.cnblogs.com      
ExtJs简介: Extjs在经过两年的发展,Ext JS从2.0版开始,越来越受用户欢迎,今年,Extjs不但推出3.0版本,而且还推出了Ext Core,准备在Web2.0网站开发中占一席之地,如在 Extjs2.x版本中为人所诟病的速度问题在ExtJs3.0中有所改善。不过,最革命性的改变还是ExtJs中新增的Ext.Direct功能,它实现了服务器端的无关性。 在3.2版本中,Ext将增加移动组件,进军移动市场,这将是一次革命性的改进,同时在4.0版本中,除了对HTML5的支持外,还增加画布功能。 还有一点更值得期待,就是Ext的RAD开发工具也在开发当中。估计在不久之后,也可以向VB,C#一样,通过可视化工具拖拽方式即可轻松开发Web应用。 ExtJs在发展过程中不仅一步步地巩固着自己在HTML、CSS、JavaScript领域无可比拟的优势,而且已经开始向相关领域发展扩张。如从2.02版开始为Adobe的RIA技术AIR提供支持,并且为GWT开发了Ext GWT2.0,这些都体现了ExtJs的强大活力和生命力。 在可预见的未来,ExtJs将会甩开对手,大踏步向前。 ExtJs的前景: ExtJS的前景是非常好的,现在的QQ2009的登录界面以及使用,迅雷最新版的主界面,都能够找到这个框架的踪迹。web QQ也是有一个技术版本是使用这种框架的,所以,可以看出,extjs的应用,是越来越广泛了,extjs的前景,不可估量,不论站在技术开发的层次还是大部分用户的使用体验。 国讯教育通用智能OA办公系统项目培训目标 本系列讲座分为四大部分: 1、ExtJs基础篇:主要介绍Ext Core的一些核心功能 2、ExtJs进阶篇:主要介绍ExtJs里的常用组件,容器及布局 3、ExtJs数据篇:主要介绍和数据库交互的相关组件及CRUD功能 4、项目实战篇: Extjs3.2+ASP.NET七层架构+设计模式+ log4j+WebSerice等技术国讯教育通用智能OA办公平台 适用对象 1、要求有一定的javascript语言和HTML,CSS基础的学员 2、有一定的Asp.net网页编程基础和C#语言基础 3、有志于从事富客户端技术ExtJs的学习与研究的学生及专业Web开发人员 模块介绍 1、ExtJs基础篇-ExtJs快速入门 1.1、ExtJs基础篇(1):ExtJs概述与环境配置及架构剖析 1.2、ExtJs基础篇(2):ExtJs OOP基础 1.3、ExtJs基础篇(3):ExtJs 核心函数简介 1.4、ExtJs基础篇(4):ExtJs中的模板详解(1) 1.5、ExtJs基础篇(5):ExtJs中的模板详解(2) 2、ExtJs进阶篇:Extjs进阶 2.1、大话ExtJs中的布局 2.2、ExtJs的常见组件 2.3、ExtJs中的面板及Window窗口 2.4、ExtJs中的选项卡面板 2.5、ExtJs中的对话框与Combox组件 2.6、ExtJs中的ExtTree详解 3、ExtJs数据篇 3.1、数据存储基本单元Record与DataField详解 3.2、数据存储Store详解1 3.3、数据存储Store详解2 3.4、数据代理DataProxy详解 3.5、数据读取器DataReader详解 3.6、Ext.Direct详解1 3.7、Ext.Direct详解2 4、ExtJs实战篇—国讯教育通用智能OA办公平台 (共70讲) 4.1、系统业务流程主功能结构分析 4.2、数据库设计 4.3、抽象工厂+反射七层架构设计 4.4、首页布局设计 4.5、人事管理模块分析设计 4.6、个人专区模块分析设计 4.7、日程管理区模块分析设计 4.8、文档管理模块分析设计 4.9、工单管理模块分析设计 4.10、工资管理模块分析设计 4.11、内部邮箱模块分析设计 4.12、系统管理模块分析设计 4.13、考勤管理模块分析设计 4.14、消息管理模块分析设计 4.15、日志管理 4.16、报表打印及数据统计 4.17、数据导入导出管理 本项目所涉及到的技术: 数据库方面: 1、PD数据库建模 2、SQL Server2005视图、存储过程、用户自定义函数、触发器 ASP.net方面: 1、ASP.net PetShop七层架构 2、抽象工厂+反射+配置文件实现数据库无缝切换 3、序列化/反序列化+泛型集合的应用 4、利用ASP.net HttpHandler实现防盗链 5、网站安全性方面:ASP.net防SQL注入及Web Service Soap头加密技术 6、AS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值