对于依赖注入,我使用Google Guice.
现在我想出了在应用程序期间记录一些信息的问题.我不是以方法调用的方式谈论一般的日志记录.我知道AOP,我可以像方法调用跟踪等一样.
我正在寻找的是手动记录.我需要一些登录我的应用程序几乎每个类的方法.所以我想到了两个选择:
通过使用Guice注入框架来获取记录器,通过构造函数(或setter或private …)对我进行此操作,但是感觉像将日志记录问题真正添加到每个类并污染我的构造函数
>在我想要调用日志的方法中使用全局服务定位器.呃所有DI球迷都会恨我这样做
那么从实际的角度来看,最好的方法是什么呢?
解决方法
I need some way of logging in nearly each class in my application.
再想一想.如果您认为您几乎每个课程都需要登录,您的设计会出现问题. This Stackoverflow answer谈论你的设计可能是什么问题.它在.NET的上下文中得到回答,但答案也适用于Java.
那个答案主要是关于异常记录的说法,对于非异常日志我会说:防止在太多的地方记录太多的信息.对于要记录的每个信息或警告,首先询问这不应该是例外.例如,不要记录“我们不应该在这个分支”,但抛出异常!
即使你想要记录调试信息,有没有人会读这个?你会得到日志文件,数千和数千行,没有人会读.如果他们阅读它们,它们必须通过所有这些文本行,并通过它们进行复杂的正则表达式搜索,以获取他们正在寻找的信息.
看到开发人员这样做的另一个原因是掩盖他们的坏代码.就像这样用意见一样.我看到开发人员记录了“我们已经执行了这个程序块”,或者“如果分支跳过了”.这样他们可以跟踪代码和大方法.
然而,我们现在都不知道写大方法,而不是写下大的方法.不,甚至更小.此外,如果您单独测试您的代码,没有太多的理由来调试代码,并且您已经验证它执行了应该做什么.
再次,良好的设计可以帮助到这里.当您使用Stackoverflow答案(使用命令处理程序)中所述的设计时,您可以再次创建一个可以序列化任意任意命令消息并在执行开始之前将其记录到磁盘的装饰器.这给你一个非常准确的日志.只需将一些上下文信息(如执行时间和用户名)添加到日志中,并且您有一个审计跟踪,甚至可以用于在调试或甚至加载测试期间重播命令.
我使用这种类型的应用程序设计几年,从那时起,我几乎没有任何理由在业务逻辑中进行额外的日志记录.现在是需要的,但是这些情况很少见.
but it feels like adding the logging concern really to
each class and pollutes my constructor
这样做,你最终会得到参数太多的构造函数.但不要责怪记录器,责怪你的代码.你在这里违反了Single Responsibility Principle.您可以通过静态外观来“隐藏”此依赖关系,但并不会降低依赖关系的数量和类的总体复杂性.
using a global service locator in the method where I want to call the log. Uhh but all DI fans will hate me for doing that
最后,你会恨自己,因为每一个类仍然有一个额外的依赖(在这种情况下很好的隐藏的依赖).这使得每个类更复杂,并且将迫使你有更多的代码:更多的代码来测试,更多的代码有bug,更多的维护代码.