您如何组织登录应用程序? 我的意思是Web应用程序或命令行应用程序,甚至移动应用程序。 我敢打赌,您有一些称为Logger
全局变量或单例,它具有一些方法,如info()
, error()
和debug()
。 您可以在应用启动时对其进行配置,或者通过诸如log4j.properties
东西对其进行配置,并将所有内容记录到控制台,文件甚至数据库中。 多年来,我一直在精确地执行此操作或执行类似操作 ,直到我终于意识到这种方法有多错误。 在我最近的Ruby应用程序中,我做的事情有所不同,从那时起,我比以前更加快乐。
![静态记录仪](https://i-blog.csdnimg.cn/blog_migrate/de4dd1576206c35f3b7591e421fbb062.png)
好吧,如果您的应用程序很简单并且几乎没有单元测试或集成测试,那么使用静态记录器就可以了,这实际上是一个全局变量。 但是,正如我们之前讨论的那样 ,全局变量是有害的。 如果使用静态记录器,会出什么问题? 或者,换句话说,就像我的一个朋友曾经说过的那样,我们要解决的问题到底是什么? 基本上有两个问题:
- 首先,使用一个全局记录器,您将很难编写单元测试来检查您的应用程序实际上是否正确记录了事情。 即使您截取日志流,也会有来自其他线程和其他测试的大量噪音。 这不是一个无法解决的问题,但是其解决方案增加了测试的复杂性。
- 其次,当您决定向最终用户显示日志的选定部分时,您将不得不进行大量编码,只是为了区分属于用户的内容和不属于用户的内容,尤其是在多线程环境中。 如果它是Java并且有线程组,那么您很幸运,但是例如在Ruby中,没有这种东西,您将必须找到一些解决方法。
为了克服这两个问题,在Ruby命令行应用程序Zold中 ,我决定将log
作为变量传递给所有需要日志记录的类。 在Ruby中,它比Java中容易,因为它们具有可选参数。 例如,看一下此类 (当然是简化版本):
该类应该列出当前目录中的所有钱包,并将其余额打印到日志( 在某些情况下将是控制台)。 但是,当从Web应用程序中调用此类时,打印的目标是一个临时文件,该文件随后在Web页面上呈现。 在单元测试中,可能还有其他事情,必须捕获发送到日志然后交付给单元测试的所有内容。
如您所见, log
的默认值为Log::NULL
,这是我必须定义自己的常量,作为默认的记录器,该记录器不会在任何地方记录任何内容。 默认情况下,此类不会记录任何内容。 它将安静地检查所有钱包的所有余额,并且不打印任何内容。 好吧,它将打印出来,但是没人会看到。
在单元测试中,我使用debug()
, info()
等一些方法创建一个对象,并将其传递给我正在测试的Zold::List
类的实例。 换句话说,它是记录器的伪/模拟版本,我用它来捕获Zold::List
发送的所有内容。 然后,我可以检查那里。
我在这里说明显的话吗? 如果是这样,为什么我们仍然在Java,Ruby,PHP,C#等中到处都有静态记录器? 无论如何,我建议您改用可注入日志记录依赖项。
是的,可以肯定地说,我确定您注意到名称的更改。 它不再是logger
,而是log
。 我确定你知道为什么 。
翻译自: https://www.javacodegeeks.com/2019/03/logging-without-static-logger.html