Ведение журнала с префиксом, определенным при инициализации класса

У меня есть модуль, над которым я работаю, в котором настроен регистратор следующим образом:

public class MyClass {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);

    public MyClass(String org, String division) {
        this.org = org;
        this.division = division;
    }

    public void myMethod() {
      if(blah) {
          LOGGER.log("Something happened");
      } else {
          LOGGER.log("Something went Wrong");
      }
    }
}

Теперь этот модуль работает для нескольких организаций и подразделений, поэтому мои журналы в Splunk выглядят так:

Something happened
Something went Wrong
Something happened
Something happened
Something went Wrong

без информации об организации или подразделении. Чтобы исправить это, кто-то начал добавлять метод addPrefix, который выглядит так:

private String addPrefix() {
    return String.format("(%s, %s)", this.org, this.division);
}

и обновил журналы до LOGGER.log("{} Something happened", addPrefix()); и LOGGER.log("{} Something went wrong", addPrefix());

Теперь наши логи выглядят так:

(org1, div1) Something happened
(org1, div2) Something went Wrong
(org2, div3) Something happened

Проблема в том, что по мере увеличения количества журналов становится сложно поддерживать это и следить за тем, чтобы каждый добавлял {}, addPrefix() в свои журналы. Есть лучший способ сделать это?

Я посмотрел в mdc, но не мог понять, как его использовать здесь.

Должен ли я инициализировать свой регистратор в своем конструкторе, где все мои параметры известны? Повлияет ли это на регистрацию в статических методах? Есть ли накладные расходы памяти для этого?


person navinpai    schedule 14.05.2020    source источник


Ответы (1)


Что вы имеете в виду: «Я заглянул в mdc, но не смог понять, как его использовать здесь». То, что вы описываете, является «ребенком плаката», когда вы захотите использовать MDC. Вы должны добавить название организации и название подразделения в MDC в начале запроса (независимо от используемой вами технологии), а затем настроить выбранную платформу ведения журналов, чтобы добавить организацию и подразделение в ваш вывод. Вы не предоставили никаких подробностей о том, какую структуру вы используете или как выглядит ваша конфигурация, но с Log4j 2 вы должны настроить

<PatternLayout pattern="(%X{organization, division}) %msg%n"/>

предполагая, что ключи, которые вы выбрали для хранения данных, были названы «организация» и «подразделение». Это приведет к выводу, как в приведенном выше примере.

person rgoers    schedule 15.05.2020