`

Log4j源代码阅读—Log4j初始化

阅读更多
一、Log4j的初始化(LogManager类中的静态块中)。

    1、 以DEBUG等级创建一个RootLogger,然后以RootLogger为参数创建一个Hierarchy类的实例。
    2、 Hierarchy类中实现了LoggerRepository接口和RendererSupport接口。LoggerRepository接口主要提供了对Logger聚集的一些访问方法和Threshold等级的支持。
    3、 以Hierarchy为参数创建一个DefaultRepositorySelector类的实例。以便提供一种获取LoggerRepository的方法。
    4、 DefaultRepositorySelector类实现了RepositorySelector接口。RepositorySelector提供了一个获取LoggerRepository的方法。
    5、 下面开始读取默认配置文件。首先尝试读取Log4j.xml,如果不存在就读取Log4j.properties。如果都不存在就放弃作默认配置。继续运行。

二、Log4j配置文件的读取(PropertyConfigurator,读取Log4j.properties文件)

    1、 准备工作
    PropertyConfigurator的静态方法Configure()可以接受三种参数:String,URL, Properties;Configure()方法生成一个PropertyConfigurator的实例并调用相应的doConfigure(XXX,LoggerRepository)。以String和URL为参数的doCofigure()方法在读取了配置文件后都会调用doConfigure(Properties,LoggerRepository)方法。
    2、 doConfigure(Properties,LoggerRepository)方法
    doConfigure()方法首先设置Log4j类库本身的调试状态,即读取”log4j.debug”属性;然后设置Log4j的Hierarchy的Threshold属性。这两个属性也是配置文件中两个唯一的顶层属性。
    下面doConfigure()调用了configureRootCategory();configureLoggerFactory(); parseCatsAndRenderers()方法分别配置RootLogger,LoggerFacory,其他Logger和Renderer。

三、onfigureRootCategory(Properties,LoggerRepository)配置RootLogger

    读取”log4j.rootLogger”属性,同步化RootLogger调用parseCatetory()方法开始配置RootLogger。
    1、 parseCategory(Properties,Logger,String key,String LoggerName,String value)配置Logger
    value第一个逗号前的是Logger的等级,除了RootLogger,其他的Logger也可以设置为”internal”,如果Logger设置了Level合法则设置Level,否则Level设为空。
    在开始配置Logger的Appender前先删除并关闭Logger中所有的Appender。在这里删除本Logger关联的Appender可以理解,可是将涉及到的Appender全部关闭,不知道有什么玄机。关闭所关联有的Appender也让Log4j的多次配置,很容易出错。
    Value中第一个逗号以后是以逗号分割的多个Appender,在读取了有效的AppenderName以后,重复调用parseAppender()配置Appender,配置完了后将配置好的Appender挂到Logger中。
    2、 parseAppender(Properties,String appenderName)配置appender
    首先尝试读取registry,看在本次的配置过程中这个appender是否已经配置过了,如果已经有配置好的Appender,直接返回配置好的Appender。
    如果这是第一次配置这个AppenderName,读取log4j.appender.[AppenderName]属性,生成相应的Appender实例。并设这Appender的名称为[AppenderName]。
    判断声称的Appender是否是OptionHandler的实例,并判断Appender是否需要Layout,如果需要就读取”log4j.appender.[AppenderName].layout’属性,生成相应的LayOut实例,并加载到Appender中。然后调用PropertySetter.setProperties()设置LayOut的属性。
    然后调用PropertySetter.setProperties()设置Appender的属性(设置过程可以参照上面LayOut属性的设置)。
    最后,将配置好的Appender添加到registry中。
    3、 PropertySetter类利用Introspection和Reflection设制相应设立的属性。(所要设置的类必须有相应得Setter,Getter方法,且方法中只能有一个参数(默认为String))。
    静态方法setProperties(Object,Properties,String prefix)首先以Object为参数生成一个PropertySetter的实例,然后调用setProperties(Properties,prefix)方法。
    setProperties(Properties,String prefix)方法遍历Properties中为[prefix]开头并且[prefix]后面不是直接跟点号”.”的属性。当设置的Object是Appender的一个实例的时候不出力”[prefix.layout]”属性(因为这个属性已经在parseAppender()方法中配置过了)。然后调用setProperty(key,value)方法设置属性。
    setProperty(String name,String value)方法首先利用内省获取name属性的PropertyDescriptor,然后调用setProperty(PropertyDescriptor,name,value)利用Reflection真正设置Object的name属性。
    最后如果所设置的对象是OptionHandler的实例,调用activateOptions()方法,实施所设置的属性,比如将设置的FileName检查一下,然后应用到相应的属性中。


四、configureLoggerFactory(Properties)配置LoggerFactory,LoggerFactory影响到后面Logger的创建。

    1、 读取”log4j.loggerFactory”属性,如果属性是一个有效的类名,并且使LoggerFactory的子类,就创建一个给类的实例,并保存到PropertyConfigurator类的一个保护变量loggerFactory中。
    2、 调用PropertySetter.setProperties()方法,以”log4j.factory.”为前缀给LoggerFactory设制属性(设置过程可以参照上面LayOut属性的设置)。

五、parseCatsAndRenderers(Properties,LoggerRepository)配置普通的Logger和Renderer。

    1、 普通Logger的配置
        遍历Properties,读取所有以”log4j.category.”和”log4j.logger.”开头的属性,截取Logger名称调用LoggerRepository.getLogger(loggerName,loggerFactory)生成一个新的Logger。关于Logger的新建,在后面单独讨论。
        同步化新建的Logger,调用parseCategory()方法配置Logger的属性(参见前面RootLogger的配置)。然后调用parseAdditivityForLogger()方法设置Logger的继承属性。
        parseAdditivityForLogger(Properties,Logger,String loggerName),首先读取”log4j.additivity.[loggerName]”属性,并调用Logger.setAdditivity()方法设置Logger的继承属性。
    2、 Renderer的配置
        遍历Properties,读取所有以”log4j.renderer.”开头的属性,截取Renderer名称,如果LoggerRepository是RendererSupport的一种实例,调用RendererMap.addRenderer()方法添加Renderer。
    3、 RendererMap.addRender(RendererSupport,String renderedClassName,String renderingClassName)添加解释器
        生成renderingClassName类的实例,然后调用RendererSupport.setRenderer (renderedClass,renderer)将renderer添加到Logger容器中。

六、最后将保存配置的Appender的registry清空。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ifeegoo/archive/2009/01/08/3736213.aspx
分享到:
评论

相关推荐

    log4j的包+源代码+例子

    3. **初始化Log4j**:在应用程序启动时,通过`PropertyConfigurator.configure()`或`DOMConfigurator.configure()`加载配置。 4. **使用Logger**:在类中获取Logger实例,然后调用相应的方法记录日志。 三、实例...

    log4net-2.0.8-src_log4net源代码_log4net_

    通过对log4net源代码的阅读和理解,开发者不仅可以更深入地利用这一工具,还可以学习到日志处理的最佳实践和设计模式,提升软件开发的效率和质量。log4net-2.0.8-src.zip和log4net-2.0.8文件包含了log4net的源代码和...

    log4j学习

    Commons Logging的核心价值在于它的灵活性和可插拔性,通过简单的配置切换,应用可以轻松地在不同的日志实现之间进行转换,如Log4j、Java Util Logging等,而无需修改任何源代码。 #### Log4j:强大的日志实现 Log...

    apache-log4j-2.0-rc1-src

    这个源码包“apache-log4j-2.0-rc1-src”包含了开发人员需要的所有源代码,以便深入了解其内部工作原理,定制功能,或者为项目做出贡献。 **Log4j基础知识:** 1. **日志级别**:Log4j支持多个日志级别,如DEBUG、...

    spring简单注解+log4j记录日志

    在Spring的bean中,我们可以使用`@PostConstruct`和`@PreDestroy`注解来标记初始化和销毁方法,同时在这些方法中插入Log4j的日志记录,以便追踪bean的生命周期。例如: ```java @Service public class MyService { ...

    spring log4j 实例

    通常,我们会在Spring的配置文件中定义一个Bean,让Spring自动初始化Log4j: ```xml <property name="staticMethod" value="org.apache.log4j.LogManager.getLogger"/> ``` 在这个例子中,`...

    maven+springmvc+mybatis+log4j框架搭建

    本教程将详细阐述如何使用四个关键组件——Maven、SpringMVC、MyBatis和Log4j——来搭建一个强大的Web应用框架,旨在提高开发效率并优化项目管理。 **Maven** 是一个流行的项目管理和综合工具,它通过统一的构建...

    封装好的log4j 包括properties文件和使用类

    总结来说,这个压缩包提供了一个简洁的日志解决方案,通过`log4j.properties`配置日志行为,`LogUtil.java`提供方便的静态方法供代码中使用,而`LogInit.java`则负责在程序启动时初始化Log4j。这样的封装方式使得在...

    slf4j-log4j12 等jar包.rar

    5. **源码**:描述中提到的"源码"可能是指SLF4J和Log4j的源代码,这对于开发者理解内部工作原理,调试问题,甚至进行定制化开发非常有用。通过查看源代码,开发者可以学习到日志框架的设计思路,以及如何实现日志...

    AndroidStudio 使用log4j记录日志,按照大小定期滚动日志Demo

    创建一个初始化方法,在应用启动时调用: ```java public static void initLogging() { Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); PatternLayout layout = new ...

    apache-log4j-2.0-rc1.rar

    3. **Lifecycle API**:Log4j 2.0引入了生命周期管理API,使得组件可以更好地控制其初始化、启动、停止和关闭过程,增强了组件的可插拔性和可扩展性。 4. **Lookup机制**:Lookup机制允许在配置文件中引用环境变量...

    log4j-jar包

    3. **初始化Log4j**:在程序启动时,调用相应的初始化方法加载配置。 4. **编写日志**:在代码中使用`Logger`类的`debug()`, `info()`, `warn()`, `error()`等方法记录日志。 5. **调试与优化**:根据实际需求调整...

    Log4j手册

    Log4j的核心优势在于其动态配置能力和丰富的API,这使得它能够在不修改源代码的情况下改变日志行为,极大地提升了程序的可维护性和灵活性。 Log4j的主要组件包括**Logger**、**Appender**和**Layout**: - **...

    log4net 使用小结 源代码

    `TestLog4Net` 这个项目的源代码可能包含了 log4net 在实际项目中的应用示例,包括配置、初始化、日志记录等。通过分析这些代码,你可以更深入地理解如何在自己的项目中有效地利用 log4net。 总之,log4net 是一个...

    apache-log4j-2.0

    在提供的压缩包文件"**log4j-2.0-alpha1**"中,这应该是Log4j 2.0的第一个alpha版本,可能包含源代码、构建脚本、文档和其他资源,用于开发人员了解和测试Log4j 2.0的功能。在使用这个版本时,需要注意它可能存在的...

    mfc使用log4cpp实例

    log4cpp是一款功能强大的C++日志库,其设计灵感来源于Java的log4j。它提供了灵活的日志级别,如DEBUG、INFO、WARN、ERROR和FATAL,以及多输出目标(如文件、控制台、网络等)和可配置的布局模式,使得开发者能够轻松...

    java日志操作之Log4j

    Log4j的核心由三个主要组件组成:Logger(记录器)、Appender(输出源) 和 Layout(布局)。 1. **Logger (记录器)** - **概念**:Logger是日志系统的入口,它负责接收日志请求并将其转发给适当的Appender。 - **使用...

    我的第一个log4j测试程序

    3. **初始化Log4j**: 在Web应用启动时加载Log4j配置,并初始化日志系统。 4. **使用Logger**: 在代码中通过`Logger.getLogger()`方法获取Logger实例,然后调用其`debug()`, `info()`, `warn()`, `error()`等方法...

    log4c完整例子源代码

    在这个项目中,你可以看到如何初始化 log4c、设置日志级别、创建 Category 和 Appender,以及如何在代码中插入日志语句。通过对这个案例的分析和实践,你可以更好地理解 log4c 的工作原理和使用方法。 总之,log4c ...

Global site tag (gtag.js) - Google Analytics