2

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

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

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

LogManager.getLogger(getClass());

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

4

5 回答 5

11

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

于 2009-02-18T22:35:28.003 回答
6

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

于 2009-02-18T22:41:21.717 回答
2

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

于 2009-02-18T22:37:13.663 回答
1

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

这样做的原因是,在类层次结构中,了解您正在处理的事物的实际类型是很有用的,即使日志记录是在超类的方法中发生的。

通常一个简单的文本搜索会给你确切的日志语句被调用,所以我没有发现它在实践中令人困惑。

于 2009-02-18T23:17:39.307 回答
1

其他发帖者已经评论说,如果你想定义一个 Logger,getClass 将不起作用static——并且为每个实例定义一个效率低下。

如果您想在运行时推断出正确的类,并且您至少使用 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 );
于 2009-02-19T10:13:22.943 回答