java - Log4j2 使用 {} 反对使用 %d 或 %s

标签 java logging configuration log4j log4j2

在 Log4j2 中,以下两者是否同样有效并且不会导致任何字符串连接具有比 DEBUG 更具体的日志级别?出于任何原因/情况,一个人会比另一个人更受欢迎吗?

log.warn(String.format("Number of cars : %d",carCount));
log.warn("Number of cars : {}",carCount );

{} 是否适用于任何类型的对象?

最佳答案

{} 表示法比 %s %d 字符串格式表示法高效得多。 (这里有benchmarks,我稍后会添加一些数字。)

{} 表示法接受任何对象或原始值,其中 %s %d ... 字符串格式要求参数类型与格式或抛出异常。所以一般来说,{} 更方便。

在某些情况下,您希望使用字符串格式语法,因为它可以让您对格式进行非常精细的控制。如果您想将一个大数字“ pretty-print ”为 1,234,567.123,或者控制小数点后的位数,那么 {} 是不够的。

Log4j2 允许您混合使用这两种用法。可以在任何地方使用字符串格式语法(通过使用 LogManager.getFormattedLogger),但也许更方便的是大多数时候使用默认的 {} 格式,并且仅当您需要使用 printf 方法进行细粒度控制时才使用 String 格式语法:

logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());

在内部,使用 {} 格式,Log4j2 努力避免创建字符串或其他临时对象。这对于 String 格式语法是不可能的。

关于java - Log4j2 使用 {} 反对使用 %d 或 %s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41532840/

相关文章:

java - Rabbit SSL 配置不起作用-{ssl_upgrade_error,{tls_alert ,"certificate unknown"}}

logging - 如何使用golang客户端写入连续写入influxdb

java - 如何管理 Java 库的内部配置设置?

cakephp configure::read value is lost' 尝试常数,相同的行为

java - Quartz 调度程序最大线程数属性

javascript - 发送二维文件数组的问题

java - 繁琐的结帐(使用 Spring 的解决方案)

Python,选择日志文件的目录

c++ - 这可能在宏中使用省略号吗?可以转换成模板吗?

java - Netbeans 如何跟踪项目的位置?