微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Spring Bean 注入/访问到 Log4j2 插件中

如何解决将 Spring Bean 注入/访问到 Log4j2 插件中

我有一个配置属性类,我想将其注入到自定义 log4j2 RewritePolicy 中。 例如

@Plugin(name = "MyPolicy",category = "Core",elementType = "rewritePolicy",printObject = true)
public class MyPolicy implements RewritePolicy {

    private MyPolicyProperties myPolicyProperties; // <-- want to inject/autowire this 

    public MyPolicy() {}

    @PluginFactory
    public static MyPolicy createPolicy() {
        return new MyPolicy();
    }

    @Override
    public LogEvent rewrite(LogEvent logEvent) {

        // do something with myPolicyProperties here

        return Log4jLogEvent.newBuilder()
            .setLoggerName(logEvent.getLoggerName())
            .setMarker(logEvent.getMarker())
            .setLoggerFqcn(logEvent.getLoggerFqcn())
            // ... etc
            .build();
    }
}
@ConfigurationProperties("app.mypolicy")
@Getter
@Setter
public class MyPolicyProperties {

    private String property1;
    private int property2;
    // ... etc
}

我已尝试实现 ApplicationListener 以按照 here 所述重新配置 log4j,但似乎无法配置 appender 和/或 rewritepolicy。还尝试实施 ApplicationContextAware 描述的 here 但也没有奏效。

是否可以访问 MyPolicyProperties 中的 MyPolicy

解决方法

它可以做到,但它几乎从不漂亮。这是因为 Log4j Plugins 是由 Log4j 的插件系统加载的,而 Spring Beans 是由 Spring 加载的。此外,它们不会同时被实例化。

如果您正在使用 Spring Boot,那么首先会发生的是 Log4j2 初始化,因为 SpringApplication 请求一个 Logger。因此,此时无法解析 Spring Bean,因为它不存在。稍后,Spring 的引导过程将再次初始化 Log4j,然后在应用程序设置期间它会再初始化一次或两次。在这些后续初始化期间,bean 可能可用。

根据您使用的应用程序类型,您可以找到 Spring 的 ApplicationContext,以便您可以调用 getBean() 并注入它。

没有通过注释或类似方法自动执行此操作的方法。

最简单的方法是在目标类中添加一个静态方法,该方法在 Spring 初始化时被初始化为引用自身,或者创建另一个类,该方法初始化静态方法以引用 Spring 创建的 bean。所以Spring会导致这些静态方法引用它创建的bean。然后让您的 Log4j 插件调用该静态方法以获取 bean 引用。一旦它不为空,您就可以将其保存在插件中,之后它应该可以正常运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。