log4j知识点

1、Log4j.properties中至少有一个appender和一个logger。

2、log4j的初始化,通常我们需要把log4j.jar和Log4j.properties或者log4j.xml放入classpath,log4j默认会在classpath中寻找log4j的配置文件,当然我们也可以指定配置文件所在的位置。

比如:

setJAVA_OPTS=%JAVA_OPTS%-Dlog4j.configuration=

或者在程序中指定PropertyConfigurator.configure()(DOMConfigurator.configure()).

3、Log4j中有三个主要的组件,它们分别是Logger、Appender和Layout.

(1)Appender用来指明log信息打印到什么地方.

(2)Layout的作用是控制Log信息的输出方式.

(3)logger指定log的名字,打印级别和采用哪种或者哪几种Appender。

4、所有的logger都是继承于rootLogger,如果某个logger没有被分配level,那么它将从一个被分配了级别的、最接近它的父logger那里继承level。

所有logger最顶层的父logger为rootLogger,所以在定义日志的时候通常我会给rootLogger赋予一个level。

5、log打印的规则:

当某个logger的loggingrequest(即printingmethod(error(),info()..))的级别高于或者等于该logger的级别(即在log4j.properties或者log4j.xml中定义)的时候,该loggingrequest就为enable.

一旦该logger的loggingrequest为enable,那么该loggingrequest将总会打印到该logger所有的appender中包括它的所有父logger的appender。(而不会管父logger的级别如何)。除非该logger的父logger的additivity设置为false,默认的情况下为true。

某个logger的additivity设置为false,表示log只打印到本log的appender中,而不再打印到其父logger的appender。

6、最简单的log4j.properties定义

log4j.rootLogger=debug,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d%p[%c]-%m%n

7、log4j是线程安全的,所以我们一般建议定义log时采用static

privatestaticfinalLoglog=LogFactory.getLog(Main.class);

8、性能优化:

推荐:

if(log.isDebugEnabled()){

log.debug("hello"+i+j);

}

而不是直接在程序中调用:

log.debug("hello"+i+j);

这样在logger打印条件不满足的情况下就不用执行字符串的操作。

9、实际开发过程中,我们通常会使用JakartaCommonsLogging(JCL),它提供的是一个日志(Log)接口(interface),允许程序开发人员使用不同的具体日志实现工具:Log4J,JDK1.4等。

如果应用程序的classpath中有log4j,CommonsLogging则使用相关的包装(wrapper)类(Log4JLogger)

如果应用程序运行在jdk1.4的系统中,CommonsLogging使用相关的包装类(Jdk14Logger)

相关推荐