在我的项目中,我有各种不同的模块,对于所有日志记录,它们都在消息中配置了前缀以进行隔离。例如
私有静态最终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
定制为仅包含前缀字符串是否可行?
鉴于您的情况,我将创建一个接口,其中包含您要查找的信息以及一个密钥-可能是每个jar唯一的软件包名称(我希望您不要在各个jar中混合软件包名称)。然后,我将在每个jar中创建该接口的实例,并将其注册为与java.util.ServiceLoader一致的服务。
然后,我将创建一个Log4j2查找,该查找使用ServiceLoader查找所有实例,并将它们在初始化期间添加到Map中。然后,我将在Log4j配置中使用该查找在LogEvent中使用Logger查找适当的值(假设Logger遵循使用类名作为其名称的约定)。