FileAppender a0=new FileAppender(new SimpleLayout(), "a0.log");
FileAppender a1=new FileAppender(new SimpleLayout(), "a1.log");
Logger root=Logger.getRootLogger();
root.addAppender(a0);
Logger x=Logger.getLogger("x");
x.addAppender(a1);
Logger xyz=Logger.getLogger("x.y.z");
xyz.debug("xyz debug...");
xyz.info("xyz info...");
两个log文件都会记录日志
DEBUG - xyz debug...INFO - xyz info...
这说明logger是有继承性的,xyz没有配置appender,就会继承祖先的配置
继承介绍
1、log4j的继承是通过命名来实现的。
比如logger.a.b就会继承logger.a的一些设置。
2、子logger会默认继承父logger的appender。
如果配置中这样写:logger.a=INFO,app_a,logger.a.b=DEBUG,app_b,那么实际上,logger.a.b的配置是这样的:logger.a.b=DEBUG,app_b,app_a。
3、子logger只在自己未定义输出级别的情况下,才会继承父logger的输出级别。
比如配置中这样写:logger.a=DEBUG,app_a,logger.a.b=,app_b,那么实际上,logger.a.b的配置是:logger.a.b=DEBUG,app_b,app_a。
但是如果配置中这样写:logger.a=DEBUG,app_a,logger.a.b=INFO,app_b,那么实际上,logger.a.b的输出级别就是INFO,而不会继承logger.a的DEBUG。这样,如果用logger.a.b记录DEBUG信息,它是不会向app_a输出的。
比如logger.a.b就会继承logger.a的一些设置。
2、子logger会默认继承父logger的appender。
如果配置中这样写:logger.a=INFO,app_a,logger.a.b=DEBUG,app_b,那么实际上,logger.a.b的配置是这样的:logger.a.b=DEBUG,app_b,app_a。
3、子logger只在自己未定义输出级别的情况下,才会继承父logger的输出级别。
比如配置中这样写:logger.a=DEBUG,app_a,logger.a.b=,app_b,那么实际上,logger.a.b的配置是:logger.a.b=DEBUG,app_b,app_a。
但是如果配置中这样写:logger.a=DEBUG,app_a,logger.a.b=INFO,app_b,那么实际上,logger.a.b的输出级别就是INFO,而不会继承logger.a的DEBUG。这样,如果用logger.a.b记录DEBUG信息,它是不会向app_a输出的。
大多数的情况,对于未设置的logger来说,不需要自动继承祖先的配置,此时需要取消祖先叠加(additivity)在子logger上的设置,通过将additivity的标识设为false
BasicConfigurator.configure();
Logger logger=Logger.getLogger("x.y");
logger.setLevel(Level.TRACE);
logger.log(Level.DEBUG, "设置的日志级别为:"+logger.getLevel());
logger.trace("trace...");
logger.debug("debug...");
logger.info("info...");
logger.warn("warn...");
logger.error("error...");
logger.fatal("fatal...");
修改logger.setLevel(Level.TRACE)中的级别,即可知道 ALL<TRACE<DEBUG<WARN<ERROR<FATAL