读书人

Log4j的汉语言文档

发布时间: 2012-11-10 10:48:50 作者: rapoo

Log4j的中文文档

?? // because INFO >= INFO.
?? barlogger.info("Located nearest gas station.");
?
?? // This request is disabled, because DEBUG < INFO.
?? barlogger.debug("Exiting gas station search");

用同一个名称调用getLogger方法将返回一个指向同一个记录器对象的引用

例如,

?? Logger x = Logger.getLogger("wombat");
?? Logger y = Logger.getLogger("wombat");

xy指向同一个日志记录器对象

因此,配置一个日志记录器,不用在代码里转换引用就可以获得相同的实例是可能的。在生物学父时代的基本矛盾里面,总是可以preceed他们的孩子,log4j的日志记录器可以按一定的规则创建和配置。尤其是,即使一个“父”日志记录器在它的子孙后面被实例化,它仍然可以发现并连接到它的子孙

在应用程序初始化的时候,Log4j的配置被执行。最好的方法是通过读取一个配置文件。很快就会讨论这个方法

通过使用软件组件,log4j很容易命名日志记录器。这可以通过在每个类中静态实例化日志记录器来完成,日志记录器名是和完整的类名相同的。这是一个直截了当地定义日志记录器的有用方法。由于日志输出带有产生该日志的日志记录器的名称,命名策略让辨认产生日志消息的源头很容易。然而,这仅仅是是一个可能,虽然命名日后子记录器的策略很普通(However, this is only one possible, albeit common, strategy for naming loggers)。Log4j没有约束日志记录器可能趋势(Log4j does not restrict the possible set of loggers)。开发者可以很自由的根据需要命名日志记录器。

不过,在类后面命名日志记录器好像是目前所知最好的策略

输出源和布局器

基于日志记录器有选择地让日志请求是否起作用地能力仅仅描述(picture)地一部分.log4j允许日志请求输出到多个目标。在log4j地声明中,输出目的地被成为输出源(appender).最近,输出源包括控制然台、文件、GUI组件、远程套接字服务器(remote socket servers)、JMS、NT事件记录器(NT Event Loggers)和远程UNIX Syslog守护进程(remote UNIX Syslog daemons)。它也可以异步地记录日志。

一个日志记录器可以有多个输出源。

AddAppender方法加一个输出源到给定的日志记录器。对应给定的日志记录器每个激活的日志请求都将被转向到所有的输出源,因为这些输出源是和层次 (hierarchy) 中更高级别的输出源一样的。换句话说,输出源是被从日志记录器的层次附加继承的(appenders are inherited additively from the logger hierarchy)。例如,假如有一个控制台输出源被加到一个根日志记录器(root logger),最后所有被激活的日志请求都将打印在控制台上,另外,假如一个文件输出源被加到日志记录器,叫做C,然后激活到C和C的孩子的日志请求将输出到一个文件和控制台。覆盖这个默认的行为是可能,以便于通过设定附加标识为假,输出源的聚集不再是附加的。

管理输出源附加行为的规则将在下面总结。

作为一个侧面的注意点,我要提及的是log4j中的子类仅仅连接到他们存在的祖先。特别的,名为com.foo.Bar的日志记录器被直接连接到根日志记录器,因而围绕在未使用的com或者com.foo日志记录器。这个显著地提高了性能,并且减少了log4j地内存消耗(footprint)

MyApp类通过调用BasicConfigurator.configure方法来配置log4j。其他类仅仅需要导入org.apache.log4j.Logger,取回他们想要的日志记录器,并且在远处记录。

前面的例子总是输出相同的日志信息。幸运的是,很容易修改MyApp,以便可以在运行是控制日志输出。下面是一个稍微修改的版本

?import com.foo.Bar;
?
 import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
?
 public class MyApp {
?
?? static Logger logger = Logger.getLogger(MyApp.class.getName());
?
?? public static void main(String[] args) {
?
?
???? // BasicConfigurator replaced with PropertyConfigurator.
???? PropertyConfigurator.configure(args[0]);
?
???? logger.info("Entering application.");
???? Bar bar = new Bar();
???? bar.doIt();
???? logger.info("Exiting application.");
?? }
 }

这个版本的MyApp构造了PropertyConfigurator类来解析一个配置文件,因此建立日志

下面是一个配置文件的实例,这个配置文件导致输出和前面也基于这个实例的BasicConfigurator类的输出完全相同的。

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
?
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
?
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

假定我们不再对com.foo包中任何组件的输出感兴趣。下面的配置文件展示了一个可能方法,利用这个方法可以完成这个任务。

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
?
# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
?
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN

用这个文件配置的MyApp的输出如下所示。

2000-09-07 14:07:41,508 [main] INFO? MyApp - Entering application.
2000-09-07 14:07:41,529 [main] INFO? MyApp - Exiting application.

由于日志记录器com.foo.Bar没有给定级别,它从com.foo继承它的级别,在配置文件中com.foo被设定为WARN。Bar.doIt方法的日志语句有DEBUG级别,这比日志记录器的级别的WARN低。因此doIt()方法的日志请求被禁止

下面是有多个输出源的配置文件。

log4j.rootLogger=debug,  

读书人网 >软件架构设计

热点推荐