关于java:使用getSimpleName()vs getName()获取记录器

Using getSimpleName() vs getName() for acquiring logger

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

1
static public Logger getLogger(String name)

1
static public Logger getLogger(Class clazz)

前者通过getSimpleName()显式传递API,后者在传递的Class上使用getName()。这两者有区别吗?如果我将不同的包配置为在log4j.properties文件中以不同的级别进行日志记录,会有什么影响?


是的,有很大的不同。

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

例如,对于两个记录器:

1
2
com.foo.A
com.foo.B

在属性中,我可以有:

1
log4j.logger.com.foo=DEBUG,CONSOLE

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

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

这将输出以下内容

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


我更喜欢使用全名(class.getname())。当包被正确组织时,这允许调整Log4J来处理源自Java包树的不同部分的不同日志消息。

例如,您可以轻松地配置包中以"com.mycompany.infra"开头的所有类,以使用特定的附加器,并且只记录级别warn或更高级别的消息。


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

返回:alin.iwin.flickrbrowser.getrawdata

同时

private string log_tag=this.getClass().getSimpleName();

仅返回:getrawdata。


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