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

2022-09-02 12:09:46

在 Log4j2 中,以下两者是否效率相同,并且不会导致任何字符串串联,其日志级别比 DEBUG 更具体?并且由于任何原因/情况,一个会比其他原因/情况更受欢迎吗?

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

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


答案 1

表示法比字符串格式表示法有效得多。(对此有基准,我稍后会添加一些数字。{}%s %d

表示法接受任何 Object 或基元值,其中 String 格式要求参数的类型与格式匹配,否则将引发异常。所以一般来说,比较方便。{}%s %d ...{}

在某些情况下,您希望使用 String 格式语法,因为它可以让您对格式进行非常精细的控制。如果要“漂亮地打印”一个大数字作为,或者控制小数点后面的位数,那么是不够的。1,234,567.123{}

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

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

在内部,Log4j2格式努力避免创建字符串或其他临时对象。使用字符串格式语法无法做到这一点。{}


答案 2

推荐