Quotes: http://blog.youkuaiyun.com/talentxie/archive/2009/02/07/3867941.aspx
log4j主要包含三个组件,分别对应为:Loggers、appenders与layouts。他们彼此协作,使得程序可以依据不同层次记录日志,在运行时控制这些日志的输出格式以及将这些日志记录到对应的场所。
再进入正式level(层次),先介绍一下命名层次的概念. 所谓命名层次,就是使用点号进行分离,点号之前的对象是点号之后对象的父结点。例如"com.foo","com"为"foo"的父节点,相反"foo"就为"com"的子节点;再如"com.foo.Bar"中,"com"为"Bar"的祖先结点等.......
logger是按照层次来建立的,因而整个框架中存在着一个根结点。这个根有两个特殊的性质:
1. 一直都存在
2. 不能通过名来获取这个对象
当然,既然设计了这个类并且其又是存在的,我们可以通过Logger.getRootLogger获取这个根结点对象。对于其他非根结点logger对 象,可以通过Logger.getLogger("对应的logger名")。下面列出Logger类的几个常用方法:
package org.apache.log4j;
public class Logger {
// Creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void trace(Object message);
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
// generic printing method:
public void log(Level l, Object message);
}
x,y,z均继承自root,同时他们之间并没有分配自己的级别,所以全都继承自root的 Proot级别。
日志对象名 自行分配级别 继承级别 root Proot Proot X Px Px X.Y Pxy Pxy X.Y.Z Pxyz Pxyz
上图中x,y,z均自行分配了级别,因而他们均使用自己的分配级别
日志对象名 自行分配级别 继承级别 root Proot Proot X Px Px X.Y none Px X.Y.Z none Px
同理,因为y没有分配对应的级别。因而其继承x对应的分配级别功能。
对于logger对象,通过调用上文提及的debug、info、warn、error、fatal函数,分别进行对象级别的日志记录。下文是一段演示代码:
// get a logger instance named "com.foo"
Logger logger = Logger.getLogger("com.foo");
// Now set its level. Normally you do not need to set the
// level of a logger programmatically. This is usually done
// in configuration files.
logger.setLevel(Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
// This request is enabled, because WARN >= INFO.
logger.warn("Low fuel level.");
// This request is disabled, because DEBUG < INFO.
logger.debug("Starting search for nearest gas station.");
// The logger instance barlogger, named "com.foo.Bar",
// will inherit its level from the logger named
// "com.foo" Thus, the following request is enabled
// because INFO >= INFO.
barlogger.info("Located nearest gas station.");
// This request is disabled, because DEBUG < INFO.
barlogger.debug("Exiting gas station search");
正如上面程序清单列出的,logger可以被赋予不同的层次级别(level)。分别为debug、info、warn、error、 fatal五个,优先级依次上升;所以在应用中,当我们设定了级别为info,那么当调用debug级别时,log4j是不会将这个函数的内容记录到对应 的appenders当中的,只有级别大于等于info才能。同时这些级别对象定义在Level类中。在log4j框架中,级别功能是可以继承的;根据上 文提及的命名层次,祖先结点设定的级别是可以被子孙结点所继承的。下面给出几张图加以解释:
日志对象名 自行分配级别 继承级别 root Proot Proot X none Proot X.Y none Proot X.Y.Z none Proot