在Log4j2中,以下两者同样有效并且不会导致任何字符串连接的日志级别比DEBUG更具体?并且出于任何原因/情况会优先于其他原因吗?
log.warn(String.format("Number of cars : %d",carCount));
log.warn("Number of cars : {}",carCount );
{}是否适用于任何类型的对象?
答案 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格式语法无法做到这一点。