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

时间:2010-11-29 22:09:49

标签: java logging log4j

我见过使用log4j的代码,使用

为给定的logger获取Logger
static public Logger getLogger(String name)

static public Logger getLogger(Class clazz)

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

5 个答案:

答案 0 :(得分:23)

是的,存在巨大差异。

我从未对simpleName实例使用Logger,因为它会删除包名称。 除了在两个不同的包中存在相同的类名(导致两个类获得相同的记录器实例)时出现问题,您将失去控制记录器继承的能力。

e.g。对于两个记录器:

com.foo.A
com.foo.B

在属性中,我可以拥有:

log4j.logger.com.foo=DEBUG,CONSOLE

答案 1 :(得分:17)

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

System.out.println("Name-->"+ShapeDemo.class.getName());
System.out.println("SimpleName-->"+ShapeDemo.class.getSimpleName());

这将输出以下

Name-->com.test.ShapeDemo
SimpleName-->ShapeDemo

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

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

返回:alin.iwin.flickrbrowser.GetRawData

同时

private String LOG_TAG = this.getClass()。getSimpleName();

仅返回:GetRawData。

答案 4 :(得分:2)

如果您在不同的包中有许多具有相同simpleName的类,您可能会感到困惑。有许多具有相同名称的记录器应该不是问题 - 否则可能会令人困惑。