Настройте менеджер журналов log4j, чтобы включить префикс во все журналы - PullRequest
0 голосов
/ 22 марта 2020

В моем проекте у меня есть различные модули, и для всей регистрации они профилируют префикс в сообщении для изоляции. Например,

личное состояние c окончательное Logger log = LogManager.getLogger (MethodHandles.lookup (). LookupClass ());

Project 1 все журналы:

log.info("{} my message my args{}", Project1.KEY, args);

Project 2 все журналы:

log.info("{} my message my args{}", Project2.KEY, args);

Вместо того, чтобы вручную вводить ключ, как каждый модуль может настроить LogManager, чтобы префикс ключа автоматически добавлялся к каждому сообщению?

I удалось обойти это путем расширения AbstractMessageFactory с помощью этого подхода, требующего много одинакового дублирования кода в каждом модуле

public class CustomLogManager extends LogManager {

    private static final class CustomMessageFactory extends AbstractMessageFactory {

        public static final CustomMessageFactory INSTANCE = new CustomMessageFactory();

        private String messageWithPrefix(String message) {
            return prefix + SEPARATOR + message;
        }

        @Override
        public Message newMessage(String message, Object... params) {
            return new ParameterizedMessage(messageWithPrefix(message), params);
        }

        @Override
        public Message newMessage(final String message, final Object p0) {
            return new ParameterizedMessage(messageWithPrefix(message), p0);
        }

        ... other overloads ...

    }

    private static final Prefix prefix = Prefix.one;

    public static Logger getLogger(final Class<?> clazz) {
        return getLogger(clazz, CustomMessageFactory.INSTANCE);
    }

}

Можно ли настроить ParameterizedMessageFactory, чтобы просто включить строку префикса

1 Ответ

0 голосов
/ 24 марта 2020

Учитывая ваши обстоятельства, я бы создал интерфейс, который содержит информацию, которую вы ищете, а также ключ - возможно, имя пакета, уникальное для каждого jar (надеюсь, вы не будете смешивать имена пакетов в jar). Затем я создал бы экземпляр этого интерфейса в каждом банке и зарегистрировал бы его как сервис в соответствии с java .util.ServiceLoader.

Затем я создал бы Log4j2 Lookup, который использует ServiceLoader, чтобы найти все экземпляры и добавить их на карту во время инициализации. Затем я использовал бы этот поиск в моей конфигурации Log4j для поиска подходящего значения, используя Logger в LogEvent (при условии, что Logger следуют соглашению об использовании имени класса для своего имени).

...