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@2b4bac49
logger1.getParent() = java.util.logging.Logger@fd07cbb
logger2 = java.util.logging.Logger@fd07cbb
logger2.getParent() = java.util.logging.LogManager$RootLogger@3571b748
true
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
严重: severe
10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
警告: warning
10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
信息: info
10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
配置: config
10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
详细: fine
10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
较详细: finer
10月 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
非常详细: finest
Process finished with exit code 0