gpt4 book ai didi

java - 自定义 log4j 日志管理器以在所有日志中包含前缀

转载 作者:行者123 更新时间:2023-12-01 17:50:58 24 4
gpt4 key购买 nike

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

私有(private)静态最终Logger log = LogManager.getLogger(MethodHandles.lookup().lookupClass());

项目1所有日志:

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

项目2所有日志:

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

每个模块如何配置 LogManager 以便将 key 前缀自动附加到每条消息中,而不是手动提供 key ?

我能够通过扩展 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以仅包含前缀字符串是否可行?

最佳答案

考虑到您的情况,我将创建一个界面,其中包含您正在查找的信息以及一个 key - 也许是每个 jar 唯一的包名称(我希望您不要在 jar 之间混合包名称)。然后,我将在每个 jar 中创建该接口(interface)的一个实例,并将其注册为符合 java.util.ServiceLoader 的服务。

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

关于java - 自定义 log4j 日志管理器以在所有日志中包含前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60795520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com