Logger之间的父子关系

JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层 RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过名称来关联。默认子Logger会继承父Logger的属性。FileSharing.jpg
image.png
由上图可见:
looger.getlooger(“包名”); 这里写的是包名 getParent() //获取父级
可以看出com.itszt则是com.itszt.service是父级包
logger1的父级是logger2
logger2的父级是com吗? 并不是 logger2虽然是com.itszt 但是我们并没有写com
使用logger2的父级是jdk中的 最顶级的

子父关系影响:

如果在logger2当中配置了相应的级别 logger1没有进行配置
则logger1会找它的父类 进行配置
默认情况下父类就是子类的默认值 子类的当中如果有的配置没有进行配置
就会找父类的配置进行配置

所有的logger实例都是由LoggerManager统一管理,不妨我们点进getLogger方法:

  1. private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
  2. LogManager manager = LogManager.getLogManager();
  3. if (!SystemLoggerHelper.disableCallerCheck) {
  4. if (isSystem(caller.getModule())) {
  5. return manager.demandSystemLogger(name, resourceBundleName, caller);
  6. }
  7. }
  8. return manager.demandLogger(name, resourceBundleName, caller);
  9. // ends up calling new Logger(name, resourceBundleName, caller)
  10. // iff the logger doesn't exist already
  11. }

我们可以看到LogManager是单例的:

  1. public static LogManager getLogManager() {
  2. if (manager != null) {
  3. manager.ensureLogManagerInitialized();
  4. }
  5. return manager;
  6. }
  1. public void testLogParent() throws Exception {
  2. Logger logger1 = Logger.getLogger("com.itszt.service");
  3. Logger logger2 = Logger.getLogger("com.itszt");
  4. System.out.println("logger1 = " + logger1);
  5. System.out.println("logger1.getParent() = " + logger1.getParent());
  6. System.out.println("logger2 = " + logger2);
  7. System.out.println("logger2.getParent() = " + logger2.getParent());
  8. System.out.println(logger1.getParent() == logger2);
  9. }
  10. 结果:
  11. logger1 = java.util.logging.Logger@2b4bac49
  12. logger1.getParent() = java.util.logging.Logger@fd07cbb
  13. logger2 = java.util.logging.Logger@fd07cbb
  14. logger2.getParent() = java.util.logging.LogManager$RootLogger@3571b748
  15. true
  1. public void testLogParent() throws Exception {
  2. Logger logger1 = Logger.getLogger("com.itszt.service");
  3. Logger logger2 = Logger.getLogger("com.itszt");
  4. // 一、对logger2进行独立的配置
  5. // 1.关闭系统默认配置
  6. logger2.setUseParentHandlers(false);
  7. // 2.创建handler对象
  8. ConsoleHandler consoleHandler = new ConsoleHandler();
  9. // 3.创建formatter对象
  10. SimpleFormatter simpleFormatter = new SimpleFormatter();
  11. // 4.进行关联
  12. consoleHandler.setFormatter(simpleFormatter);
  13. logger2.addHandler(consoleHandler);
  14. // 5.设置日志级别
  15. logger2.setLevel(Level.ALL);
  16. consoleHandler.setLevel(Level.ALL);
  17. // 测试logger1是否被logger2影响
  18. logger1.severe("severe");
  19. logger1.warning("warning");
  20. logger1.info("info");
  21. logger1.config("config");
  22. logger1.fine("fine");
  23. logger1.finer("finer");
  24. logger1.finest("finest");
  25. }
  26. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  27. 严重: severe
  28. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  29. 警告: warning
  30. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  31. 信息: info
  32. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  33. 配置: config
  34. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  35. 详细: fine
  36. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  37. 较详细: finer
  38. 10 21, 2021 12:45:15 下午 com.itszt.entity.LoggerTest testLogParent
  39. 非常详细: finest
  40. Process finished with exit code 0