记录器父子关系
JUL 中 Logger 记录器之间是存在 “父子” 关系的,这种父子关系不是我们普遍认为的类之间的继承关系,关系是通过树状结构存储的。
JUL 在初始化时会创建一个顶层 RootLogger 作为所有 Logger 的父 Logger,RootLogger 是 LogManager 的内部类,默认的名称为空串。
以上的 RootLogger 对象作为树状结构的根节点存在的,将来自定义的父子关系通过路径来进行关联,父子关系同时也是节点之间的挂载关系。
代码示例:
@Test
public void test06() {
// 创建两个 logger 对象,可以认为 logger1 是 logger2 的父亲
// RootLogger 是所有 logger 对象的顶层 logger,名称默认是一个空的字符串
Logger logger1 = Logger.getLogger("com.jul");
Logger logger2 = Logger.getLogger("com.jul.JulTest");
System.out.println(logger2.getParent() == logger1);
System.out.println("----");
System.out.println("logger1名称:" + logger1.getName() +
",\n父Logger名称:" + logger1.getParent().getName() +
",\n父Logger引用:" + logger1.getParent());
System.out.println("----");
System.out.println("logger2名称:" + logger2.getName() +
",\n父Logger名称:" + logger2.getParent().getName() +
",\n父Logger引用:" + logger2.getParent());
System.out.println("----");
// 父亲所做的设置,也能够同时作用于儿子
// 对 logger1 做日志打印相关的设置,然后我们使用 logger2 进行日志的打印
logger1.setUseParentHandlers(false);
ConsoleHandler handler = new ConsoleHandler();
SimpleFormatter formatter = new SimpleFormatter();
handler.setFormatter(formatter);
logger1.addHandler(handler);
handler.setLevel(Level.ALL);
logger1.setLevel(Level.ALL);
//儿子做打印
logger2.severe("severe:错误信息");
logger2.warning("warning:警告信息");
logger2.info("info:默认信息");
logger2.config("config:配置信息");
logger2.fine("fine:详细信息(少)");
logger2.finer("finer:详细信息(中)");
logger2.finest("finest:详细信息(多)");
}