为什么 Java 中的记录器很少有 System.out.println 中的 .toString() ?

Why do loggers in Java rarely have the .toString() that System.out.println does?

我经常因为

而烦恼
System.out.println(someObject);

并且,当将其更改为使用所需的任何记录器时

LOG.info(someObject);

并且必须添加 .toString() 才能编译

LOG.info(someObject.toString());

我不记得曾经使用过一个记录器,它不只是接收一个对象并尝试对其执行 .toString() 操作,这让我想知道是否有特定原因。我肯定不会是唯一一个因为必须将 .toString() 添加到所有内容而烦恼的人吧?

关键是理解日志记录的目的。记录器用于打印关于应用程序中发生的任何事件的人类可读的英文消息。并且日志 API 是按照这个基本原则构建的

LOG.info(someObject.toString());

以上行的问题在于日志记录的基本概念与您要实现的目标有些不同。您想要记录一个已经不是人类可读实体的对象,然后通过将其转换为字符串来使其工作,或者您可以实现 toString() 方法,或者最后您可以查看其中一个重载函数

public void info(String format, Object... arguments)

直接记录一个对象主要是由开发人员在他们想要调试时完成的,比如对象的内容或类似的东西,所以实现这一点的最好方法是正确实现 toString() 方法。

我还建议看一下 Project Lombok,它提供了随时可用的 bean 通用 hashCode() 和 toString() 函数的实现,因此您不必通过方法一一编码实现。