`
isiqi
  • 浏览: 16539146 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论
阅读更多

1 Log4net简介

Log4net是基于.net开发的一款非常著名的记录日志开源组件。最早是2001年7月由NeoWorksLimited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。现由Apache组织开发与维护。此日志架构是可灵活扩展,且通过配置文件来设置日志的属性及输出,不同修改代码即可实现程序的灵活跟踪。可以将日志分不同的等级,通过不同的过滤条件,以不同的样式,将日志输出到不同的媒介。可以从http://logging.apache.org/log4net/downloads.html网站下载最新版本的Log4net源码。

2 Log4net结构分析

2.1 结构划分

log4net 有五种主要的组件:Logger(记录器)、Repository(库)、Appender(附着器)、Layout(布局)以及 Filter(过滤器)。虽然它们的职责各有不同,但它们通过有机组合,最终构成Log4net的大体框架和功能。

2.2 结构总图


图1、Log4net框架的结构图

如上图所示,Utils命名空间里的类为Log4net的基础工具类,它提供对一些基本功能和服务。它为整个Log4net框架提供基础功能和服务。这里的类不参与Log4net中类的架构层次,却是为了使Log4net架构更清晰明了,把一些零散的基础的功能和服务集合在一起,形成了此命名空间。

Log系列对象属于最外层命名控件log4net中的核心,它提供了用户使用的接口,公用户使用来记录日志,主要是便于用户理解和使用,它对外隐藏了Log4net内复杂的架构和实现原理。

Config命名控件内的类主要负责Log4net组件的环境配置。它主要通过两种方式来配置Log4net组件,一种是通过设置程序集特性配置,另一种是通过直接在代码中加载配置文件。

Core命名空间容纳框架的核心接口、连接各个组件的管理类以及在多个组件或层次中都要使用的关键类。这里的接口和类一般不会暴露给用户扩展和使用。

由于Respository系列类中定义了日志对象(ILogger)的组织结构,他负责组织ILogger对象以及附加功能,所以Respository命名空间包括Respository系列类和ILogger对象的默认实现。以及专门为了组织日志对象需要的类。

Plugin命名空间提供了附加功能扩展接口以及默认实现类。

ObjectRender命名空间提供了对象的打印方式接口以及默认实现类。

Logger组件不是命名空间,但是它在框架中却是一个很重要的角色:日志对象类。由于它的重要性以及在框架中的应用广泛性,它的顶层接口ILogger在Core命名空间中定义,而默认实现却在Respository命名空间中,就是为了实现对日志对象结构的组织和管理。有架构图可以看出,每个Logger对象都有自己的输出方式Appender。

Appender命名空间中的类负责日志的输出,定义日志的输出方式,框架中定义了16种输出方式。在Appender对象中可以定义自己的日志布局和过滤方式。

Filter命名空间为定义要输出的日志的过滤器接口及默认实现类。过滤器是以职责链的形式组织的。

Layout命名空间定义了日志的输出格式类。

2.3 日志的记录过程分析

用户在使用Log4net框架来记录日志时,需要通过LogManager.GetLogger()获取ILog对象,然后用ILog对象的Error()等方法记录日志。然而,在框架中日志对象是ILogger的实现类,ILog对象只是对ILogger对象的包装,以便于用户的理解和使用。

ILogger对象在Log4net中是已一定的层次结构组织的。这就是Repository的作用。ILogger拥有继承机制,可以继承父节点的Appender。ILogger拥有自己的Appender集合,负责输出日志。Appender拥有自己的过滤器Filter和布局Layout。

2.3.1 在创建日志对象前必须配置日志环境,通常是通过XML来配置的。下图是配置的过程:

图2、解析配置文件的类图

图2展现了两种配置方式:

一是直接在代码中通过调用XmlConfigurator.Configure()来解析配置文件,配置日志环境;

二是通过定义程序集特性来加载并解析配置文件,配置日志环境。不过这种方式只能在创建第一个ILog对象时才能加载配置文件。

2.3.2 在加载并解析配置文件时就会搭建Log4net日志环境。图3就是搭建日志环境以及创建各种对象的流程。


图3、搭建日志环境以及创建各种对象的流程

2.3.3 既然用户是通过ILog对象来记录日志的,那么如何获取ILog对象以及它又如何包装日志对象(ILogger对象)呢?图4即是创建ILog对象的过程。

图4、创建ILog对象的过程

ILog对象是通过LogManager工具类来创建的。LogManager工具类通过LoggerManager创建ILogger对象,然后使用ILoggerWraper对其进行包装,并通过WrapperMap进行管理Logger和ILoggerWraper之间的映射。

ILogger对象的集合在ILoggerRepository中按一定的结构进行组合和管理所以需要从ILoggerRepository中获取ILogger对象。欲获取ILogger对象,必须首先获取ILoggerRepository对象。IRepositorySelector就是负责缓存和管理ILoggerRepository对象的类,所以需要通过IRepositorySelector获取ILogger对象所在的ILoggerRepository对象,然后再从ILoggerRepository对象中获取ILogger对象。

2.3.4 既然ILog对象不是日志对象,那么ILog又是如何记录日志的呢?

图5、记录日志的过程

用户通过LogManager.GetLogger()获取ILog对象,然后通过ILog对象的Error()等方法记录日志。但是ILog对象的方法最终会映射为ILogger对象的Log()方法。在调用ILogger的Log()方法时,会创建一个LoggingEvent对象,此对象记录了日志的信息,之后就可以把LoggingEvent对象在ILogger对象和IAppender对象之间传递,直到把日志信息写入TextWriter中才可销毁。LoggingEvent对象的生命周期是从调用ILogger的Log()方法起,直到此条消息写入TextWriter中为止。ILogger对象需要调用自己的IAppender对象来把日志信息写到媒体上,IAppender对象需要调用IFilter对象来过滤需要写入媒体的日志,然后调用ILayout对象来设置日志的输出格式。

来自:

http://www.cnblogs.com/goody9807/archive/2010/11/01/1866197.html

分享到:
评论

相关推荐

    log4net源码

    **log4net源码分析** `log4net`是一款广泛使用的日志记录框架,它源自Java平台上的log4j,并被移植到了.NET环境中。这款开源库提供了强大的日志记录功能,支持多种输出方式,如控制台、文件、数据库等,且具有可...

    log4net-2.0.8-src_log4net源代码_log4net_

    《深入解析log4net:基于源代码的洞察》 log4net是一款强大的日志记录...log4net-2.0.8-src.zip和log4net-2.0.8文件包含了log4net的源代码和编译后的库,对于想要学习和研究log4net的开发者来说,是一份宝贵的资源。

    log4cpp源码完整解析

    完整分析了log4cpp的整体架构,详细介绍了log4cpp的这个重要组件的实现分析了log4cpp内部所使用的设计模式。介绍了log4cpp中的Category的完整实现细节,介绍了所有的Layout及其子类的具体实现。也详细介绍了比较常用...

    log4net1.2.11.dll 和 log4net1.2.11源码

    源码分析对于理解log4net的工作原理和扩展其功能至关重要。通过阅读源码,开发者可以: 1. **理解内部工作流程**:查看Appender、Layout、Repository、Hierarchy等关键组件的实现,了解它们如何协同工作,记录、...

    log4qt源码

    六、源码分析 阅读Log4Qt的源码,我们可以深入了解其内部工作流程。例如,Logger类中的callAppenders()方法如何遍历并触发所有关联的Appender;AppenderBase类如何处理异步日志记录;PatternLayout如何根据预定义的...

    log4j 源码包 日志包 2.11.0

    通过对Log4j 2.11.0源码的深入研究,开发者不仅可以掌握其基本用法,还能了解其背后的实现机制,从而更好地利用这一强大的工具,提升开发效率,优化系统性能。同时,源码学习也是提升编程技能的重要途径,能帮助...

    log4net 日志操作 源码

    在本文中,我们将深入探讨log4net的基本概念、配置以及源码分析,以帮助你更好地理解和应用这个工具。 ### 1. log4net 概述 log4net是一个灵活的日志框架,它允许程序员控制日志信息的输出目的地、格式以及级别。...

    log4net 使用小结 源代码

    **一、log4net 简介** log4net 是一个开源的日志记录框架,广泛应用于.NET平台,为应用程序提供灵活且强大的日志记录功能。它遵循 Apache 软件基金会的 log4j 设计模式,提供了多种日志输出方式,包括控制台、文件、...

    log4cpp源码 供参考学习用

    很好很强大的log4cpp源码文件,供大家参考学习,因为需要下载别人的东西,所以要点分向大家,如果实在没分想学习,告诉我邮箱我发给你

    log4cpp 日志 源码

    log4cpp便是这样一个强大的日志库,它以其灵活性、可扩展性和易用性在开源社区中广受好评。本文将深入探讨log4cpp的源码,揭示其内在的设计理念和实现机制,为C++开发者提供宝贵的学习资源。 一、log4cpp简介 log4...

    C#调用Log4net写日志例子源码

    通过分析源码,你将能更好地理解和掌握C#中使用Log4net进行日志管理的技巧。 总之,Log4net是C#开发者强大的日志工具,它提供灵活的配置、丰富的日志级别和多样的输出方式,能够满足各种复杂的应用场景。通过学习和...

    log4j 1.2.15 源码

    五、源码分析 在log4j 1.2.15源码中,我们可以深入研究这些核心组件的实现细节,例如Logger是如何根据配置文件进行初始化的,Appender是如何实现日志输出的,以及Level是如何影响日志过滤的。通过对这些关键部分的...

    log4j学习源码教程

    本教程将通过源码分析,深入讲解log4j的工作原理和使用方法。 **1. log4j的基本概念** - **Logger**: 日志记录器,是log4j的核心接口,用于生成不同级别的日志事件。 - **Level**: 日志级别,包括DEBUG、INFO、...

    log4net案例源码

    这个案例源码提供了一个实际的log4net应用实例,对于初学者或者刚接触log4net的人来说,是非常有价值的参考资料。 首先,log4net的核心概念包括配置、日志级别和Appender。配置决定了日志信息如何被记录、存储和...

    log4cpp源码

    **log4cpp源码分析** `log4cpp`是一个用于C++编程的开源日志库,它提供了类似于Java中的log4j的日志处理框架。这个库设计的目标是为应用程序提供灵活、可配置的日志记录机制,支持多种日志级别、输出目的地以及...

    log4cpp-1.1.3.tar.gz源码和测试代码

    通过阅读和分析这段代码,我们可以学习到如何在C++项目中集成和使用log4cpp。 而"log4cpp-1.1.3.tar.gz"文件则包含了完整的源码,包括库的核心组件、配置文件、示例程序和测试用例。解压后,我们可以看到如下主要...

    log4php源码和示例

    **log4php源码分析与应用示例** `log4php`是PHP中的一款日志记录框架,基于Apache的log4j项目理念设计,旨在提供一个灵活且强大的日志记录解决方案。它允许开发者以结构化的方式记录应用程序运行过程中的各种信息,...

    log4j-1.2.17含源码

    源码分析方面,我们可以关注几个关键类:`org.apache.log4j.Logger`是日志记录的主要接口,`org.apache.log4j.Category`(Logger的实现)负责实际的日志记录,`org.apache.log4j.Appender`接口定义了日志输出的基本...

    log4net 数据库日志

    `log4net`是Apache的一个开源项目,是.NET平台上一个强大的日志框架。它支持多种日志记录目标,包括文件、控制台、邮件、数据库等。在这个“log4net数据库日志”主题中,我们将深入探讨如何使用log4net将日志信息...

Global site tag (gtag.js) - Google Analytics