代码之家  ›  专栏  ›  技术社区  ›  MetroidFan2002

在Spring管理的Web应用程序中,在log4j附加器中检索Spring管理的bean有哪些可用选项?

  •  3
  • MetroidFan2002  · 技术社区  · 15 年前

    我目前的构建主管在理论上有一个很好的想法——构建一个定制的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一样通过依赖注入进行设置——bean引用永远不会改变,不管初始化了多少个附加器。有什么想法吗?

    2 回复  |  直到 9 年前
        1
  •  7
  •   ChssPly76    15 年前

    因为必须初始化log4j,所以会出现bootstrap问题。 之前 春天。无论您使用的是 custom configuration 或者log4j的标准初始值设定项,它必须在应用程序上下文之前启动。

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

    另一种方法是在Spring上下文初始化后动态地重新配置log4j;例如,编写 listener 抓住 ContextStartedEvent ,获取所有类型的bean Appender 并将它们添加到log4j配置中。这也将允许您将附加器创建为bean,但一定程度上避免了单例混乱。

        2
  •  0
  •   Community CDub    7 年前

    有点晚了,但我希望这能帮助别人。我在以下链接中提供的答案中记录了此问题的解决方案:

    log4j - Accessing spring bean from logging appender class