【发布时间】:2013-07-10 22:19:22
【问题描述】:
我尝试基于 Java 构建和应用程序。
对于依赖注入,我使用 Google Guice。
现在我遇到了在申请过程中记录一些信息的问题。我不谈论以方法调用等方式进行的一般日志记录。我知道AOP 并且我可以用它来进行方法调用跟踪等。
我寻找的是手动记录。我需要某种方式来登录我的应用程序中的几乎每个类。于是我想到了两个选择:
- 使用 Guice 注入框架通过构造函数(或 setter 或 private ...)为我执行此操作来获取记录器,但感觉就像将日志记录问题真正添加到每个类并污染我的构造函数
- 在我要调用日志的方法中使用全局服务定位器。呃,但所有 DI 粉丝都会因为我这样做而讨厌我
那么从实际的角度来看,最好的方法是什么?
【问题讨论】:
-
进行“手动记录”时会记录哪些信息?
-
我所知道的所有日志框架都对具体的日志实例使用单例工厂。如果你想灵活地使用记录器实现,你可以使用像 slf4j 这样的记录外观。
-
我不同意@Pyranja。如果您想要更大的灵活性,请定义您自己的
ILogger抽象(只包含一个成员),将您的日志框架隐藏在该抽象后面并将该接口注入需要它的类中。这使您可以正确地对该代码进行单元测试并隐藏第三方依赖项。看看this answer。 -
我认为我们必须同意不同意。在我看来,日志记录是一项通用任务,使用自定义抽象不会带来可观的好处。像 slf4j 这样已建立的日志门面已经提供了这样的抽象(如果不喜欢静态工厂,也可以注入)。除非有特殊要求,否则我希望自定义记录器界面与现有的记录器界面非常相似,并且可以互换。将外观连接到具体的日志记录实现的繁重工作已经完成!
-
@Steven:调试信息,例如文件解析(来自哪个文件)。但随着我的思考,我意识到其中一些与 SRP 冲突
标签: java logging dependency-injection service-locator