logEvent.getContextData().size() == 0
和logEvent.getContextStack().size() == 0
,但LogEvent
的属性可以正常使用:
public class MyAppender extends AbstractAppender {
.........
@override
public void append(LogEvent ev) {
ev.getDataContext().size(); // <=== how can this equals 0?
ev.getStackContext().size(); // <=== how can this equals 0?
....
}
}
我无法弄清楚为什么会这样。我需要创建AbstractConverter
吗? AbstractFilter
?我的log4j2.xml
或插件配置错了吗?
答案 0 :(得分:0)
根据我们在评论中的讨论,看起来你真正追求的是location information。在自定义appender中,可以通过遍历LogEvent.getSource()
提供的堆栈跟踪来获取。您应该知道获取此信息的费用昂贵(参见documentation)。
修改强>
正如您所说,位置信息非常有用,所以很难获得它。不幸的是,Log4J无法做到这一点 - 这取决于java的架构。
一个通常用于获取类名的更便宜的方法是确保记录的Logger
以其使用的类命名(参见documentation here)。然后,您可以通过调用LogEvent.getLoggerName()
在appender中获取类名。但请注意,如果您正在编写可以在多个项目中重用的通用Appender
实现,那么假设这将始终是调用类的名称将是不好的做法。相反,它应该被解释为“日志调用来自的函数上下文,由应用程序确定”。