用于定义记录器非静态的缺点

mar*_*its 10 java logging

对此答案的评论如何减少Java日志记录样板代码?强烈建议不要使用记录器作为实例成员变量.我可以想到两个负面的副作用:
1)超类日志与子类的记录器
2)对象无法序列化(除非标记为瞬态)

但是,如果不需要序列化并且使用子类名称进行日志记录不是问题,那还有什么可以避免的原因吗?我认为它减少了样板代码,避免了将logger变量定义从一个类复制到另一个类时的复制粘贴错误.即使Spring框架(我相信它具有非常好的编码标准)也使用这种方法.

Rob*_*ska 9

如果Logger是实例成员而不是静态成员,则每次创建新对象时都必须检索Logger.尽管这种开销可能微不足道,但这是一个缺点.

从设计的角度来看,Loggers实际上并不是对象的属性,因为它们通常是关于系统的元信息,而不是系统本身的业务信息.一个Logger是不是真的喜欢一个东西部分Car以相同的方式对象EngineTransmission为.将Logger绑定到对象作为成员(在大多数情况下)在语义上没有任何意义.

  • 一些记录器具有缓存机制.Log4j使用`LogManager`类来缓存记录器,因此使用静态和非静态记录器的开销是相同的. (2认同)

Rya*_*ord 0

尝试调试错误,当SuperClass错误真正记录在类中时,您会看到类生成的消息SubClass。我见过几种情况,开发人员创建一个LoggingUtils类来生成消息,这些消息通常会复制日志框架已经内置的内容。

我看到的使用共享日志记录实例的唯一真实情况是类似于 Apache commons HttpClient 记录器httpclient.wire,它在多个类之间共享,用于记录通过客户端发送的请求和响应的内容。这种特定的日志记录情况不会记录包实际实现的信息,它会记录有关整个 http“事务”的信息。