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

And*_*897 8 java configuration logging log4j log4j2

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

log.warn(String.format("Number of cars : %d",carCount));
log.warn("Number of cars : {}",carCount );
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*pma 17

{}表示法比%s %dString格式表示法更有效.(有基准,我稍后会添加一些数字.)

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

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

Log4j2允许您混合两种用法.可以在任何地方使用String格式语法(通过使用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());
Run Code Online (Sandbox Code Playgroud)

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

  • 默认情况下,Log4j 会吞掉异常。您可以通过设置ignoreExceptions =“false”来配置每个Appender以将异常传播给调用者。请参阅附加程序文档。 (2认同)