在 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/