使用getSimpleName()vs getName()获取记录器

kur*_*der 18 java logging log4j

我见过使用过的代码log4j,它logger是为给定的Logger使用而获取的

static public Logger getLogger(String name)
Run Code Online (Sandbox Code Playgroud)

static public Logger getLogger(Class clazz)
Run Code Online (Sandbox Code Playgroud)

与前api明确传递getSimpleName(),而后者使用getName()传递Class.这两者有区别吗?如果我将各种包配置为在log4j.properties文件中的不同级别进行日志记录会影响吗?

kda*_*bir 23

是的,有很大的不同.

我从来没有使用simpleNameLogger,因为它剥离下来的包名实例.除了在两个不同的包中存在相同的类名(导致两个类获得相同的记录器实例)时出现问题,您将失去控制记录器继承的能力.

例如,对于两个记录器:

com.foo.A
com.foo.B
Run Code Online (Sandbox Code Playgroud)

在属性中,我可以拥有:

log4j.logger.com.foo=DEBUG,CONSOLE
Run Code Online (Sandbox Code Playgroud)


小智 17

例如,我的类ShapeDemo.java驻留在com.test包中,我编写了如下代码.

System.out.println("Name-->"+ShapeDemo.class.getName());
System.out.println("SimpleName-->"+ShapeDemo.class.getSimpleName());
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容

Name-->com.test.ShapeDemo
SimpleName-->ShapeDemo
Run Code Online (Sandbox Code Playgroud)


Eya*_*der 5

我更喜欢使用全名(Class.getName()).正确组织包时,这允许调整log4j以处理源自java包树的不同部分的不同日志消息.

例如,您可以轻松配置以"com.mycompany.infra"开头的包中的所有类以使用特定的appender,并仅记录级别为WARN或更高级别的消息.


小智 5

使用 this.getClass().getName();

返回:alin.iwin.flickrbrowser.GetRawData

同时

私人字符串LOG_TAG = this.getClass().getSimpleName();

仅返回:GetRawData。


Arm*_*and 2

如果不同包中有许多相同的类,您可能会感到困惑simpleName。拥有许多同名的记录器应该不是问题,否则可能会造成混乱。