Java日志记录 - 包装器?

8

我开始一个新项目并考虑了一些关于日志记录的问题。我一直使用的模式是,在每个需要进行日志记录的类中,都有自己的静态Logger:

private static final Logger logger = Logger.getLogger(LoggingInterceptor.class);

我并不太喜欢这种方法,因为我需要在每个记录日志的类中复制此行。我考虑使用Android的方法,即有一个Log类和它的静态方法来记录日志。我开始在互联网上搜索其他人使用过的类似方法,但没有找到任何东西。
因此,我的问题是:这种方法可能有什么缺点?
我想不出任何缺点,反而有一些优点,因为它遵循DRY模式。可以像Android那样使用“标签”处理不同的类别,这是静态Log方法的参数。例如:
 Log.debug(tag, message, exception);

Log类本身将使用常见的日志框架,例如Log4j甚至SLF4J。

因此,我对您的意见很感兴趣。


顺便提一下,Play框架2采用了类似的方法。 - smk
2
"[...] 它遵循DRY模式"?恰恰相反!您提出的方法强制您始终指定标记,而在静态final变量中检索类(或类别)的记录器仅指定一次。当您决定更改类别时会怎样呢? - Seelenvirtuose
是的,这可能是一个观点。但是如果您要为另一个标记记录语句呢?考虑到标记不仅用于指定日志所放置的类,而且可能是系统的子系统。因此,您可能希望捆绑跨多个类别制作的子系统的一些日志。 - homedom
1个回答

2

基于 java.util.logging.Logger APIthis articlegetLogger() 的主要目的是确保在子系统之间独立使用相同的 LoggerHandler 集合。

Java 的推荐解决方案是在每个文件的顶部获取 Logger,然后在需要时记录到该对象。

使用静态的 Log.debug 需要每次处理 tag,以便使用正确的 Handler 集合。因此,与准备好的 Log 对象相比,效率会较低。

但是,如果您不使用 handlers,或者不区分子系统,则静态函数将是一个合理的快捷方式,只要所使用的库满足您的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接