使用带有占位符的Slf4j/Log4jLogger时出现Java-NumberFormatException



好的,所以我只是想调用例如

LOG.info("Info message: {}", "some message")

我得到了一个完全奇怪的例外:

java.lang.IllegalArgumentException: can't parse argument number: 
at java.base/java.text.MessageFormat.makeFormat(MessageFormat.java:1454)
at java.base/java.text.MessageFormat.applyPattern(MessageFormat.java:492)
at java.base/java.text.MessageFormat.<init>(MessageFormat.java:371)
at java.base/java.text.MessageFormat.format(MessageFormat.java:860)
at org.jboss.resteasy.resteasy-jaxrs@3.15.1.Final//org.jboss.resteasy.logging.impl.Log4jLogger.warn(Log4jLogger.java:109)

Caused by: java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:678)
at java.base/java.lang.Integer.parseInt(Integer.java:786)
at java.base/java.text.MessageFormat.makeFormat(MessageFormat.java:1452)

无法弄清楚记录器出了什么问题-有什么想法吗?

看起来您的日志记录实现使用java.text.MessageFormat。最终info(String format, Object... args)方法调用MessageFormat.format(String模式,Object…args(方法,该方法需要MessageFormat的Patterns and Their Interpretation中描述的模式。

因此,在您的情况下,传递到info方法的第一个参数中的大括号内容被解释为FormatElement,它至少需要一个(非负整数(索引,该索引应指向传递到info方法的下一个参数。因此,{0}参考是有效的。

举例来说,你也可以这样做:

LOG.info("Info message: on {1, date} at {1, time} I received {0}.", "some message", new Date());

应该会产生这样的结果:

信息消息:2021年11月16日下午1:05:01,我收到了一些消息。

相关内容