默认情况下,log4j2 允许您使用 Java 的 MessageFormat
语法来格式化消息。事实上,在框架提供的类中进行探索,我发现了一个 MessageFormatMessage
实现
log4j2 接受 log.info("用户 {} 在 {} 进入安全区域",用户名,url);
但是众所周知,如果您想使用占位符样式的语法写入控制台,您必须执行 System.out.println(MessageFormat.format("User {0 } 进入安全区域 {1}",用户名, url));
。它不太酷,因为您必须始终记住将所有参数写入从 0 开始的
我对代码进行了更多深入研究,found this
protected String formatMessage(final String msgPattern, final Object... args) {
try {
final MessageFormat temp = new MessageFormat(msgPattern, locale);
return temp.format(args);
} catch (final IllegalFormatException ife) {
LOGGER.error("Unable to format msg: " + msgPattern, ife);
return msgPattern;
}
}
我不明白的是:既然 log4j 使用记录器给出的模式调用 Java Text 的 MessageFormat,并且因为我的理解 log4j 默认为 MessageFormatMessage
,为什么我可以调用 log4j使用没有参数编号的模式,并且我无法使用 MessageFormat.format
进行相同的省略?
如果能够使用相同的 log4j 技巧来格式化我的代码中的常规 Java 消息
最佳答案
Log4j2 中的默认消息工厂是 ParameterizedMessageFactory
.
这是使用参数标记 {}
接受格式字符串的类型。
您提出的方法是 MessageFormatMessage
类的一部分,该类又被另一个名为 MessageFormatMessageFactory
的消息工厂使用。 。当您决定使用此工厂时,Log4j2 将仅接受符合 java.text.MessageFormat
的格式字符串。
关于java - 为什么 Log4j 接受日志消息占位符的未编号括号语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46241879/