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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java项目中,可以通过以下步骤来初始化log4j系统: 1. 首先,确保你的项目中已经包含了log4j的依赖库。你可以在项目的构建文件(如pom.xml)中添加以下依赖项: ```xml <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> ``` 2. 在项目的源代码中,创建一个log4j配置文件。这个文件通常以".properties"或者".xml"为后缀名。以下是一个简单的log4j配置文件示例(log4j.properties): ```properties # 设置日志级别为INFO log4j.rootLogger=INFO, stdout # 定义输出到控制台的Appender log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ``` 3. 在你的Java代码中,通过调用`PropertyConfigurator`类的`configure()`方法来加载log4j配置文件。例如: ```java import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class MyClass { // 创建日志记录器 private static final Logger logger = Logger.getLogger(MyClass.class); public static void main(String[] args) { // 加载log4j配置文件 PropertyConfigurator.configure("path/to/log4j.properties"); // 使用日志记录器打印日志 logger.info("This is an informational message."); } } ``` 在以上示例中,通过`PropertyConfigurator.configure()`方法指定了log4j配置文件的路径。然后,你可以使用`logger`对象记录不同级别的日志消息。 这就是初始化log4j系统的基本步骤。你可以根据自己的需要进行进一步的配置和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值