java - IntelliJ 中的源步骤后 Log4j 消息对象意外呈现

标签 java intellij-idea log4j2

在调试一些 Java 代码 (Log4J 2.5) 时,我看到了一种我无法推理的奇怪行为。

在渲染Log4J日志消息的过程中,构造了一个Log4jLogEvent对象:

public LogEvent createEvent(String loggerName, Marker marker, String fqcn, Level level, Message data, List<Property> properties, Throwable t) {
    return new Log4jLogEvent(loggerName, marker, fqcn, level, data, properties, t);
}

Log4jLogEvent 的作者 ( grepcode ) 是一个简单的方法,它将给定的参数分配到新构造的对象字段中:

private Log4jLogEvent(String loggerName, ... Message message, ...)
{
    this.endOfBatch = false;
    this.loggerName = loggerName;
    this.marker = marker;
    this.loggerFqcn = loggerFQCN;
    this.level = level == null?Level.OFF:level;
    this.message = message;                    // <--- issue is seen here
    ...

问题出在 message 字段的分配上。 message 是一个 ParameterizedMessage ( grepcode ), 并且有一个 formattedMessage 字段,它是一个字符串。

只需跳过 this.message = message,变量/监 window 口就会显示 message 的所有字段 正如预期的那样,被复制到 this.message 中,除了 formattedMessage,它已渲染(从 >null 到实际渲染的字符串)。

源步骤之前的屏幕截图(IntelliJ Ultimate 2017.1):

enter image description here

源步骤后的屏幕截图 - 请注意 formattedMessage 的值:

enter image description here

查看ParameterizedMessage的代码,唯一可以执行此渲染的函数是formatMessage,称为 通过getFormattedMessage()。所以我的工作假设是,getFormattedMessage() 以某种方式被调用。

我的问题:

  • 这是否可能 - 隐式调用 getFormattedMessage()
  • 或者是否有一些代码正在执行,但 IntelliJ 没有透露?
  • 或者我缺少一些非常基本的东西吗?

当尝试“步入”此语句时,它只是跳过它。 我尝试在 getFormattedMessage()ParameterizedMessage 的所有其他函数上放置断点, 但在执行此源步骤时没有命中任何内容。

最佳答案

您所看到的是 toString() 正在执行其工作。调试器显示基于 toString() 的值,在本例中,toString() 调用 getFormattedMessage()

因此,这不是作业在执行任何操作,而是调试器调用 toString() 并通过它执行操作。

关于java - IntelliJ 中的源步骤后 Log4j 消息对象意外呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47494584/

相关文章:

java - 指向同一对象的多个引用变量是否都占用与该对象相同的内存占用

java - 使用 spring 管理 struts 操作(由约定插件配置)

java - 部署时添加属性文件

log4j2 - 使用 Gradle 构建 JAR 时生成插件 .dat 文件

java - 动态更改 Log4j 文件名

java - Apache Ignite 作为多个数据库或其他持久性的统一外观

java - 每隔特定毫秒调用一个方法

java - 外部log4j2配置文件

Java 源文件在 IntelliJ 中显示为空的反编译类文件

java - Intellij IDEA 无法启动