Почему у `public void append (LogEvent ev) есть ev.getContextData (). Size () == 0`?(в противном случае ev в порядке) - PullRequest
0 голосов
/ 06 июня 2018

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 или, возможно, неправильная конфигурация плагина?

1 Ответ

0 голосов
/ 06 июня 2018

Исходя из нашего обсуждения в комментариях, похоже, что на самом деле вы ищете информацию о местоположении .В пользовательском приложении это можно получить, пройдя трассировку стека, предоставленную LogEvent.getSource().Вы должны знать, что получение этой информации стоит дорого (см. Документацию ).

Редактировать

Как выКак уже говорилось, информация о местоположении может быть очень полезной, поэтому обидно, что ее дорого получить.К сожалению, Log4J ничего не может с этим поделать - это зависит от архитектуры java.

Один более дешевый метод, который обычно используется для получения хотя бы имени класса, состоит в том, чтобы гарантировать, что Logger, в который выполняется вход, назван в честькласс, в котором он используется (см. документацию здесь ).Затем вы можете получить имя класса в приложении, позвонив по номеру LogEvent.getLoggerName().Однако обратите внимание, что если вы пишете общую реализацию Appender, которая может быть повторно использована в нескольких проектах, было бы плохой практикой предполагать , что это всегда будет именем вызывающего класса.Вместо этого его следует интерпретировать как «функциональный контекст, из которого поступил вызов регистрации, как определено приложением».

...