定制log4j日志管理器以在所有日志中包含前缀

问题描述 投票:0回答:1

在我的项目中,我有各种不同的模块,对于所有日志记录,它们都在消息中配置了前缀以进行隔离。例如

私有静态最终Logger日志= 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,以便密钥前缀自动附加到每个消息?

我能够通过使用这种方法扩展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定制为仅包含前缀字符串是否可行?

java logging log4j2
1个回答
0
投票

鉴于您的情况,我将创建一个接口,其中包含您要查找的信息以及一个密钥-可能是每个jar唯一的软件包名称(我希望您不要在各个jar中混合软件包名称)。然后,我将在每个jar中创建该接口的实例,并将其注册为与java.util.ServiceLoader一致的服务。

然后,我将创建一个Log4j2查找,该查找使用ServiceLoader查找所有实例,并将它们在初始化期间添加到Map中。然后,我将在Log4j配置中使用该查找在LogEvent中使用Logger查找适当的值(假设Logger遵循使用类名作为其名称的约定)。

© www.soinside.com 2019 - 2024. All rights reserved.