在调试一些 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):
源步骤后的屏幕截图 - 请注意 formattedMessage
的值:
查看ParameterizedMessage
的代码,唯一可以执行此渲染的函数是formatMessage
,称为
通过getFormattedMessage()
。所以我的工作假设是,getFormattedMessage()
以某种方式被调用。
我的问题:
- 这是否可能 - 隐式调用
getFormattedMessage()
? - 或者是否有一些代码正在执行,但 IntelliJ 没有透露?
- 或者我缺少一些非常基本的东西吗?
当尝试“步入”此语句时,它只是跳过它。
我尝试在 getFormattedMessage()
和 ParameterizedMessage
的所有其他函数上放置断点,
但在执行此源步骤时没有命中任何内容。
最佳答案
您所看到的是 toString()
正在执行其工作。调试器显示基于 toString()
的值,在本例中,toString()
调用 getFormattedMessage()
。
因此,这不是作业在执行任何操作,而是调试器调用 toString()
并通过它执行操作。
关于java - IntelliJ 中的源步骤后 Log4j 消息对象意外呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47494584/