有人知道我是如何使用{}
注释在大数字中包含千位的分隔符的吗?
log.info("Reading {} entries (multiplied with one million)", entries * 1_000_000);
输出(目前):
Reading 80000000 entries (multiplied with one million)
输出(期望):
Reading 80,000,000 entries (multiplied with one million)
有没有办法直接在Log4J2中实现这一点,而不使用额外的格式化程序,如DecimalFormat
?
当您调用记录器方法之一时,Log4j2创建一个Message
,它通常具有固定的字符串表示。
大多数方法创建ParameterizedMessage
s(参见可用消息),使用StringBuilder#append
来格式化您的参数。这没有为整数提供任何替代表示。
如果你想要一个不同的格式,你可以:
-
使用
Logger#printf
来解释使用java.util.Formatter
的格式字符串并创建StringFormattedMessage
:log.printf(Level.INFO, "Reading %,d entries (multiplied with one million)", entries * 1_000_000);
从方法签名中可以推断,它总是创建一个临时对象数组,并且不是没有垃圾的。
-
当您创建记录器时,您可以指定不同的
MessageFactory
。如果你使用StringFormatterMessageFactory,所有您的消息将被格式化为java.util.Formatter
:final Logger log = LogManager.getLogger(MyClass.class, StringFormatterMessageFactory.INSTANCE); log.info("Reading %,d entries (multiplied with one million)", entries * 1_000_000);
不创建临时对象数组。
-
您也可以使用
FormattedMessageFactory
,它动态地确定您的格式字符串是否符合java.util.Formatter
,java.text.MessageFormat
或使用简单的{}
占位符。当然,这种灵活性是以轻微的性能代价为代价的。