Log4J - 在对LogManager.getLogger()的调用中显式指定类名是否有任何意义?

时间:2009-02-18 22:31:37

标签: java log4j

我正在处理一些包含很多代码的遗留代码,例如

private final Logger logger = LogManager.getLogger(ThisClassName.class);

我想知道键入“ThisClassName.class”是否有任何优势,而不是

LogManager.getLogger(getClass());

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

5 个答案:

答案 0 :(得分:11)

如果您正在制作Logger static,则无法使用getClass()

答案 1 :(得分:6)

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

答案 2 :(得分:2)

getClass()无法在静态上下文中运行。 ThisClassName.class适用于静态变量和实例变量。

答案 3 :(得分:1)

我通常会将getClass()版本与实例变量Logger一起使用(您不是创建另一个记录器实例,只是查找一个)。

这样做的原因是,在类层次结构中,知道您正在处理的事物的实际类型是有用的,即使从超类中的方法内发生日志记录也是如此。

通常,简单的文本搜索会准确地为您提供正在调用的日志语句,因此我在实践中并未发现它令人困惑。

答案 4 :(得分:1)

其他海报已经评论说,如果你想定义一个static Logger,getClass将不起作用 - 并且每个实例定义一个效率很低。

如果您希望在运行时推断出正确的类,并且至少使用Java 5,请查看log5j,它将log4j包装在Java 5 API中。

这可以让您编写如下内容:

private static final Logger log = Logger.getLogger();

甚至:

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