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

Java 使用getSimpleName()vs getName()获取记录器,java,logging,log4j,Java,Logging,Log4j,我见过使用log4j的代码,它使用 static public Logger getLogger(String name) 及 前者使用getSimpleName()显式传递api,而后者对传递的类使用getName()。这两者之间有区别吗?如果我将不同的包配置为在log4j.properties文件中的不同级别进行日志记录,会不会产生影响?如果在不同的包中有许多类具有相同的simpleName,您可能会感到困惑。拥有许多同名的伐木工人不应该是个问题,否则可能会令人困惑。是的,这是一个巨大的差

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

static public Logger getLogger(String name)


前者使用
getSimpleName()
显式传递api,而后者对传递的
类使用
getName()
。这两者之间有区别吗?如果我将不同的包配置为在log4j.properties文件中的不同级别进行日志记录,会不会产生影响?

如果在不同的包中有许多类具有相同的
simpleName
,您可能会感到困惑。拥有许多同名的伐木工人不应该是个问题,否则可能会令人困惑。

是的,这是一个巨大的差异

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

e、 g.对于两名伐木工人:

com.foo.A
com.foo.B
在properties中,我可以只拥有:

log4j.logger.com.foo=DEBUG,CONSOLE

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


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

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

System.out.println("Name-->"+ShapeDemo.class.getName());
System.out.println("SimpleName-->"+ShapeDemo.class.getSimpleName());
这将输出以下内容

Name-->com.test.ShapeDemo
SimpleName-->ShapeDemo
使用this.getClass().getName()

返回:alin.iwin.flickrbrowser.GetRawData

同时

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


仅返回:GetRawData。

已在上述文章中介绍过
Name-->com.test.ShapeDemo
SimpleName-->ShapeDemo