Java Log4J-在对LogManager.getLogger()的调用中显式指定类名有什么意义吗?

Java Log4J-在对LogManager.getLogger()的调用中显式指定类名有什么意义吗?,java,log4j,Java,Log4j,我正在处理一些遗留代码,其中有很多代码 private final Logger logger = LogManager.getLogger(ThisClassName.class); 我想知道输入“ThisClassName.class”是否比输入“ThisClassName.class”有什么好处 LogManager.getLogger(getClass()); 据我所知,没有,但我想知道使用getClass()是否有任何负面影响。谢谢。如果要使记录器静态,则不能使用getClass(

我正在处理一些遗留代码,其中有很多代码

private final Logger logger = LogManager.getLogger(ThisClassName.class);
我想知道输入“ThisClassName.class”是否比输入“ThisClassName.class”有什么好处

LogManager.getLogger(getClass());

据我所知,没有,但我想知道使用getClass()是否有任何负面影响。谢谢。

如果要使
记录器
静态
,则不能使用
getClass()

getClass()在静态上下文中不起作用。ThisClassName.class适用于静态变量和实例变量。

此外,如果存在实际调用该方法的子类,则getClass()将隐藏实际的类。例如,假设在类A的方法X中,您调用log.debug(),而类B扩展了类A,覆盖了方法X,但在某个时候调用了super.X。日志文件将显示B类,而不是A类。

我通常使用带有实例变量
Logger
getClass()
版本(您没有创建另一个Logger实例,只是查找一个)

这样做的原因是,在类层次结构中,即使日志记录是从超类上的方法中进行的,了解您正在处理的对象的实际类型也是很有用的


通常,一个简单的文本搜索将为您提供确切的日志语句调用内容,所以我在实践中没有发现它令人困惑

其他海报已经评论说,如果您想定义一个
static
Logger,那么getClass将不起作用,并且为每个实例定义一个记录器效率低下

如果您希望在运行时推断出正确的类,并且您至少使用了Java5,请看一看,它将log4j封装在Java5API中

这使您可以编写以下内容:

private static final Logger log = Logger.getLogger();
甚至:

log.debug( "This thing broke: %s due to bar: %s on this thing: %s", foo, bar, car );

真正地记录器是最终的,类在初始化时传递给它,所以我不明白为什么会有什么不同。(不一定是说你错了,只是说我认为你应该仔细检查一下。我手边没有log4j,所以我无法测试它。)我相信我个人以前也遇到过这种情况。但是,这已经有一段时间了,因为在那之后我放弃了那个特殊的实践。嗯,我认为他们必须对泛型做一些有趣的事情来允许“Logger.getLogger();”。事实证明,它们正是我为自己的项目的日志管理器实现的:创建异常并读取堆栈跟踪。不过,这确实让我觉得我在做一些合法的事情