【发布时间】:2015-12-02 23:23:51
【问题描述】:
所以我查看了有关 Java 日志记录的最佳实践(slf4j、log4j、logback 等),并且似乎库之间已经同意日志 API 的外观。我一直阅读的建议是这样的代码,您可以在其中为每个类创建一个记录器:
class Foo{
Logger logger = Logger.getLogger(Foo.class);
//...
logger.info("my log message");
//...
}
现在我并没有真正得到为不同类设置单独的记录器的好处。为什么是 info/debug/etc. Logger 类中的方法不是静态的?
请不要给出类似“好处是您可以根据类配置记录器。例如,您可以将各个类的日志级别设置为调试...”之类的回答,因为我认为这是您也可以使用完全静态的 Logger 类来完成。
如果您环顾四周(例如,在 stackoverflow 上:Log4J: Strategies for creating Logger instances),您会发现人们使用这样的成语:
Logger.getLogger(Thread.currentThread().getStackTrace()[2].getClass().getCanonicalName());
现在,您无需为每个类创建一个记录器,您只需在静态(例如)info() 方法中调用上述代码,您可以在其中确定调用类并像您一样平等地应用所有记录器配置否则。
那么谁能告诉我一个真实的原因,为什么有人应该为每个类使用一个记录器而不是使用一个静态记录器?纯粹是历史原因吗?我错过了什么吗?我知道这可能会对性能产生影响,但它在内存使用方面实际上是积极的(当然在运行时方面是消极的)......
更新 我想你甚至可以在静态信息/调试/等中使用此代码。方法,比上面的代码更漂亮,性能更高:
Reflection.getCallerClass()
但是对该方法的支持似乎有问题>=JDK7
【问题讨论】:
标签: java logging log4j slf4j logback