java - 为什么 Log4j 接受日志消息占位符的未编号括号语法?

标签 java

默认情况下,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/

相关文章:

java - 如何从 spring-boot-starter-parent 中排除特定的依赖项

java - 简介java并行/顺序排序

java - Android 应用程序在重新启动前崩溃

java - 使用 C++ 编译和运行 java 文件时无法加载主类

java - 在 Eclipse 中将用户库定义为项目的一部分而不是工作区

java - 重写compareTo有什么影响?

java - 带有 Glassfish 的 Geotools : Failed to connect to the EPSG database

java - java、Tensorflow中的全连接层

java - 仅在测试中执行 Java 代码

java - 将文本文件内容加载到文本区域