我正在处理一些包含很多代码的遗留代码,例如
private final Logger logger = LogManager.getLogger(ThisClassName.class);
我想知道键入“ThisClassName.class”是否有任何优势,而不是
LogManager.getLogger(getClass());
据我所知,没有,但我想知道使用getClass()是否有任何负面影响。感谢。
答案 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 );