什么时候以及为什么在打印日志时使用字符串格式更好?

When and why is better to use string format in printing log?

我想使用 log4j 在我的日志应用程序中打印一些值(字符串、日期、ecc)。 例如:

Sting idUser="Test123";
String name="Jack";
int age=22;

applicationlog.info("The selected user has this value :\n");
applicationlog.info("name :"+name+ "id: "+idUser+" age :"+age);

但是我发现在一些应用程序中写着:

applicationlog.info(String.format("name :%s id :%s age :%d",name,idUser,age));

所以我的问题是: 什么时候以及为什么只在打印日志中使用字符串格式而不是“+”更好?我知道使用“+”连接字符串更好,但我不认为是这种情况,事实上这里只有打印。 谢谢

log4j v2 内置了对 Substituting Parameters

的支持
applicationlog.info("name: {} id: {} age: {}", name, idUser, age);

以及 printf 支持... printf 样式

applicationlog.printf("name: %s id: %s age: %d", name, idUser, age);

性能有差异。

applicationlog.info("name :"+name+ "id: "+idUser+" age :"+age);

在您的特定情况下,您不会注意到,因为您使用的是 Strings,但如果您要记录的对象更复杂但包含 toString 方法,那么在这种情况下 toString 方法将 总是 被调用,无论日志级别如何。

applicationlog.info(String.format("name :%s id :%s age :%d",name,idUser,age));

在这种情况下,例如,如果关闭日志记录,则对象的 toString 方法将不会 被调用。

这更适用于 DEBUGTRACE 级别的日志记录,但这是一个值得养成的习惯。

许多记录器还将提供参数替换机制,这可能是实现此功能的更好方法。

applicationlog.info("name: {} id: {} age: {}", name, idUser, age);