记录器相关的问题在java中

abs*_*son 1 java logging

来自java.util.logging.Logger:

记录器名称可以是任意字符串,但它们通常应基于记录组件的包名称或类名称,例如java.net或javax.swing

有谁可以向我解释这句话?

Ber*_*t F 6

记录器名称可以是任意字符串,但它们通常应基于记录组件的包名称或类名,例如java.net或javax.swing"

"记录器名称可以是任意字符串 ......":

public class Foo {
    private static final Logger logger = Logger.getLogger("specify logger name here - you can use any logger name you want, even supercalifragilisticexpialidocious");
}
Run Code Online (Sandbox Code Playgroud)

任何想要相同记录器实例的代码都必须指定相同的记录器名称(好运拼写"supercalifragilisticexpialidocious"两次相同).

但是,您可能希望更轻松地共享记录器,获取特定类的记录器以进行配置,或者在记录器之间具有层次关系(例如,将记录器组织到父项和子项中).类和包已经按层次结构组织,因此他们建议使用记录器名称:

"...通常应该基于已记录组件的包名称或类名 ..."

package com.example.stackoverflow;

public class Foo {
    private static final Logger logger = Logger.getLogger("com.example.stackoverflow.Foo");
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以轻松地从任何地方获取任何类的任何记录器的句柄(我只需要知道它的完全限定的类名).此外,现在Logger框架可以看到哪些记录器与哪个记录器相关,例如"com.example.stackoverflow"的记录器是"com.example.stackoverflow.Foo"的记录器的父记录器.

但是如果包名更改或您的类名更改怎么办?下面的代码与上面的代码完全相同,但是以更少冗余和更易维护的方式:

package com.example.stackoverflow;

public class Foo {
    private static final Logger logger = Logger.getLogger(Foo.class.getName());
}
Run Code Online (Sandbox Code Playgroud)

现在,如果包更改,则会自动处理记录器名称.如果类是在IDE重命名时,IDE会注意到的Foo.class文字在getLogger上面的调用和更新Foo.class相应的文字.