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

时间:2017-01-08 12:46:33

标签: java logging configuration log4j log4j2

在Log4j2中,以下两者同样有效并且不会导致任何字符串连接的日志级别比DEBUG更具体?并且出于任何原因/情况会优先于其他原因吗?

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

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

1 个答案:

答案 0 :(得分:12)

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

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

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

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

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

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