我正在处理一些遗留代码,其中包含很多代码,例如
private final Logger logger = LogManager.getLogger(ThisClassName.class);
我想知道输入“ThisClassName.class”是否有任何优势,而不是
LogManager.getLogger(getClass());
据我所知,没有,但我想知道使用 getClass() 是否有任何负面影响。谢谢。
如果您正在制作Logger
static
,则无法使用getClass()
。
此外,如果存在实际调用该方法的子类,则 getClass() 将掩盖实际的类。例如,假设在类 A 的方法 X 中,您调用 log.debug() 并且类 B 扩展类 A,覆盖方法 X,但在某些时候调用 super.X。日志文件将显示 B 类,而不是 A 类。
getClass() 在静态上下文中不起作用。ThisClassName.class 适用于静态和实例变量。
我通常会使用getClass()
带有实例变量的版本Logger
(您没有创建另一个记录器实例,只是查找一个)。
这样做的原因是,在类层次结构中,了解您正在处理的事物的实际类型是很有用的,即使日志记录是在超类的方法中发生的。
通常一个简单的文本搜索会给你确切的日志语句被调用,所以我没有发现它在实践中令人困惑。
其他发帖者已经评论说,如果你想定义一个 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 );