Logger之间的父子关系
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层 RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过名称来关联。默认子Logger会继承父Logger的属性。

由上图可见:
looger.getlooger(“包名”); 这里写的是包名 getParent() //获取父级
可以看出com.itszt则是com.itszt.service是父级包
logger1的父级是logger2
logger2的父级是com吗? 并不是 logger2虽然是com.itszt 但是我们并没有写com
使用logger2的父级是jdk中的 最顶级的
子父关系影响:
如果在logger2当中配置了相应的级别 logger1没有进行配置
则logger1会找它的父类 进行配置
默认情况下父类就是子类的默认值 子类的当中如果有的配置没有进行配置
就会找父类的配置进行配置
所有的logger实例都是由LoggerManager统一管理,不妨我们点进getLogger方法:
private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {LogManager manager = LogManager.getLogManager();if (!SystemLoggerHelper.disableCallerCheck) {if (isSystem(caller.getModule())) {return manager.demandSystemLogger(name, resourceBundleName, caller);}}return manager.demandLogger(name, resourceBundleName, caller);// ends up calling new Logger(name, resourceBundleName, caller)// iff the logger doesn't exist already}
我们可以看到LogManager是单例的:
public static LogManager getLogManager() {if (manager != null) {manager.ensureLogManagerInitialized();}return manager;}
public void testLogParent() throws Exception {Logger logger1 = Logger.getLogger("com.itszt.service");Logger logger2 = Logger.getLogger("com.itszt");System.out.println("logger1 = " + logger1);System.out.println("logger1.getParent() = " + logger1.getParent());System.out.println("logger2 = " + logger2);System.out.println("logger2.getParent() = " + logger2.getParent());System.out.println(logger1.getParent() == logger2);}结果:logger1 = java.util.logging.Logger@2b4bac49logger1.getParent() = java.util.logging.Logger@fd07cbblogger2 = java.util.logging.Logger@fd07cbblogger2.getParent() = java.util.logging.LogManager$RootLogger@3571b748true
public void testLogParent() throws Exception {Logger logger1 = Logger.getLogger("com.itszt.service");Logger logger2 = Logger.getLogger("com.itszt");// 一、对logger2进行独立的配置// 1.关闭系统默认配置logger2.setUseParentHandlers(false);// 2.创建handler对象ConsoleHandler consoleHandler = new ConsoleHandler();// 3.创建formatter对象SimpleFormatter simpleFormatter = new SimpleFormatter();// 4.进行关联consoleHandler.setFormatter(simpleFormatter);logger2.addHandler(consoleHandler);// 5.设置日志级别logger2.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);// 测试logger1是否被logger2影响logger1.severe("severe");logger1.warning("warning");logger1.info("info");logger1.config("config");logger1.fine("fine");logger1.finer("finer");logger1.finest("finest");}10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent严重: severe10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent警告: warning10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent信息: info10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent配置: config10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent详细: fine10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent较详细: finer10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent非常详细: finestProcess finished with exit code 0
