gpt4 book ai didi

spring - 有哪些可用选项可用于在 Spring 管理的 Web 应用程序内的 Log4J Appender 中检索 Spring 管理的 bean?

转载 作者:行者123 更新时间:2023-12-02 11:39:22 25 4
gpt4 key购买 nike

我当前的构建主管在理论上有一个好主意 - 构建一个自定义 Log4J 附加程序,它接受 Spring 管理的 bean,并使用它们将错误记录到各种其他来源,而不仅仅是标准日志文件。然而,除了创建一个在启动时使用应用程序上下文初始化的单例(稍后编写代码)之外,我似乎想不出在 Log4J 附加程序中检索 Spring 托管 bean 的任何其他选项。

public class SpringSingleton implements ApplicationContextAware {
private static ApplicationContext context;
public SpringSingleton() {
super();
}
public static ApplicationContext getContext() {
return SpringSingleton.context;
}
public void setApplicationContext(ApplicationContext context) {
if(SpringSingleton.context != null) {
throw new IllegalStateException("Context is already set!");
}
SpringSingleton.context = context;
}
}

理想情况下,这些属性可以像 Spring 中的 bean 一样通过依赖注入(inject)进行设置 - bean 引用永远不会改变,无论初始化了多少个附加程序。有什么想法吗?

最佳答案

由于 log4j 必须在 Spring 之前初始化,因此您将遇到 boostrap 问题。无论您使用 custom configuration 还是 Log4j 的标准初始化程序,它都必须在应用程序上下文启动之前启动。

现在,理论上你可以让你的自定义appender“懒惰”地初始化自己(通过上面建议的方法或者让appender本身成为“半”单例 - 例如appender类有一个静态实例字段,由afterPropertiesSet()填充方法;这样你就可以将appender本身创建为Spring中的bean),但它看起来有点困惑和不一致。

另一种方法是在 Spring 上下文初始化后动态重新配置 Log4j;例如写入 listener 来捕获 ContextStartedEvent ,从上下文中获取所有类型为 Appender 的 bean 并将它们添加到 Log4j 配置中。这也将允许你将你的appender创建为bean,但在某种程度上避免单例困惑。

关于spring - 有哪些可用选项可用于在 Spring 管理的 Web 应用程序内的 Log4J Appender 中检索 Spring 管理的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1730634/

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