为什么`public void append(LogEvent ev)有ev.getContextData()。size()== 0`? (否则ev很好)

时间:2018-06-06 10:09:10

标签: java logging log4j2

logEvent.getContextData().size() == 0logEvent.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或插件配置错了吗?

1 个答案:

答案 0 :(得分:0)

根据我们在评论中的讨论,看起来你真正追求的是location information。在自定义appender中,可以通过遍历LogEvent.getSource()提供的堆栈跟踪来获取。您应该知道获取此信息的费用昂贵(参见documentation)。

修改

正如您所说,位置信息非常有用,所以很难获得它。不幸的是,Log4J无法做到这一点 - 这取决于java的架构。

一个通常用于获取类名的更便宜的方法是确保记录的Logger以其使用的类命名(参见documentation here)。然后,您可以通过调用LogEvent.getLoggerName()在appender中获取类名。但请注意,如果您正在编写可以在多个项目中重用的通用Appender实现,那么假设这将始终是调用类的名称将是不好的做法。相反,它应该被解释为“日志调用来自的函数上下文,由应用程序确定”。