Log4j简介 收藏

  • 格式:doc
  • 大小:107.00 KB
  • 文档页数:18

Log4j简介 收藏

一、Log4j使用

1、 配置运行环境,包含log4j-1.2.9.jar,使用BasicConfigurator.configure()配置运行环境。

2、 使用Logger.getLogger(TestLogginLevel.class)获取Logger实例。

3、 使用fatal()、error()、warn()、info()、debug()打印Log。

二、记录器(Logger)log4j允许程序员定义多个记录器,每个记录器有自己的名字,记录器之间通过名字来表明隶属关系(或家族关系)。

1、 Logger的层次结构。X.y的logger是x.y.z的logger的父logger,x是x.y.z的祖先logger.

1. Logger loggerX = Logger.getLogger(Y.class);

2.

3. Logger loggerY = Logger.getLogger(X.class);//取得的是同一个Logger实例。

2、 Logger的等级(Logger-Level filter)。如果Logger没有定义等级,则使用它父Logger的等级。根Logger的等级为DEBUG。

等级次序:OFF>FATAL>ERROR>WARN>INFO>DEBUG>ALL;

可以使用logger. setLevel(Level.DEBUG)设置Logger的等级。

等级过滤:如果执行等级

3、 基准过滤等级(Hierarchy-wide Threshold filter)。它有两种作用范围,全局范围和Appender范围,它的过滤级别高于实行等级。可以使用如下程序设置:

1. LoggerRepository repository = logger.getLoggerRepository();

2.

3. repository.setThreshold(Level.OFF);

三、存储器(Appenders):负责Log的保存。

1、 log4j 中,log信息通过存放器输出到目的地。支持的存放器有console,

files, GUI components, remote socket servers, JMS, NT Event Loggers, remote UNIX Syslog daemons。通过file存放器,log信息可以被输出到不同的文件中(即不同的目的地)。log信息可被异步存放。

2、 一个记录器可以有多个存放器,可以通过方法addAppender来增加存放器。一条blog信息如果可被这个记录器处理,则记录器会把这条信息送往每个它所拥有的存放器。

3、 每个记录器有一个继承开关,其开关决定记录器是/否继承其父记录器的存储器。可以使用setAdditivity()方法设置继承开关,默认为打开状态。

4、 Appender也可以设置过滤器,在配置文件中的属性为:Threshold。也可在程序中用setThreshold()方法设置,参数为Priority类的静态常量{FATAL,ERROR,WARN,INFO,DEBUG}。

5、 可以在一个Logger绑定两个同样的Appender。

四、布局器(Layouts)布局负责格式化输出的log信息。log4j的PatternLayout可以让程序以类似C语言printf的格式化模板来定义格式。

五、对象翻译器(Object Rendering),提供可插入式的对象翻译器,即将对象翻译为相应的消息。可以让你在不在对象类中添加toString()方法,而格式化类的信息。

1、 果想翻译的类实现了toString()方法,可以使用DefaultRenderer。

2、 自己的对象翻译器需要实现org.apache.log4j.or.ObjectRenderer接口。

3、 如果子对象没有相应的翻译器类,则会使用父类对应的翻译器类。

六、Logger的执行时序。

1、 执行Hierarchy-wide Threshold过滤。

2、 执行Logger-Level过滤。

3、 生成LoggingEvent。

4、 调用Appender。

5、 调用Layout格式化LoggingEvent。

6、 返回格式化好的LoggingEvent,在Appender中执行相应的Log动作。

七、性能(已经和System.out.println()差不多了)

1、 Logging关闭后的性能:应该在写Log之前判断isDebugEnabled()和相应的方法。优:可以省去一些对象调用toString()的时间。弊:当Logging打开时会做两次判断。

2、 如何Logging的性能:从继承的路径中寻找Appender是比较费时的,建议继承路径应该短点。

3、 Logging中的性能:操作文件系统等物理硬件是很费时的。

八、XML配置文件

1、 Log4j首先查找默认的配置文件log4j.xml,如果没有找到就找log4j.properties。

2、 Log4j.xml只有Log4j1.2.7以后才支持,之前的版本只支持log4j.properties。

九、重新读取配置文件。

1、 它是线程安全的。

2、 它并不是将上一次配置文件中的所有Appender、Logger删除,重新配置,而是指将在新的配置文件中涉及到的Appender关闭并删除。

3、 支持增量配置。注:不能再新的配置中涉及到已经配置的内容,一旦修改了某个Logger的配置可能关闭某些Appender。

十、Log4j的配置

正如看到的,如果程序没有配置Log4j,他会报出一些Log4j没有初始化的错误,而用户可能并不愿意看到这类错误,这样可以通过如下的函数来解决:

1. static void turnOffLogging()

2. {

3. Logger root = Logger.getRootLogger(); 4. boolean rootIsConfigured = root.getAllAppenders().hasMoreElements();

5.

6. if(!rootIsConfigured)

7. {

8. root.setLevel(Level.OFF);

9. }

10. }

十一、Sevlet中Log4j的配置

1、 建议将log4j-1.2.9.jar放在WEB-INF/lib/目录下。配置文件放在WEB-INF/classes/目录下,这样没个应用可以是用 独立的配置。当然,如果想在整个服务器上使用一种配置,可是将Log4j的配置,交给应用服务器如jBoss、weblogic等。

2、 如果无法确定在何处初始化Log4j,可是使用一个Sevlet做初始化工作。

Web.xml配置如下:

1.

2.

log4j-init

3. chapter3.Log4jInitServlet

4.

5.

log4j-init-file

6. WEB-INF/classes/log4j.properties

7.

8. 1

9.

sevlet代码如下:

1. public void init()

2. {

3. String prefix = getServletContext().getRealPath("/");

4. String file = getInitParameter("log4j-init-file");

5.

//if the log4j-init-file is not set, then no point in trying

6. if(file != null)

7. {

8. PropertyConfigurator.configure(prefix+file);

9. } 10. }

11. Log4j源代码阅读—Log4j初始化

收藏

12. 一、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属性。这两个属性也是配置文件中两个唯一的顶层属性。