【问题标题】:Inject/Access Spring Bean into Log4j2 Plugin将 Spring Bean 注入/访问 Log4j2 插件
【发布时间】:2021-03-10 09:48:11
【问题描述】:

我有一个配置属性类,我想将它注入到自定义 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,但也没有用。

有没有办法访问MyPolicy中的MyPolicyProperties

【问题讨论】:

    标签: spring-boot logging plugins log4j2 autowired


    【解决方案1】:

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

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

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

    没有自动的方法通过注释或类似的东西来做到这一点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 2012-02-19
      • 2011-05-29
      • 1970-01-01
      • 2023-04-09
      • 2011-09-09
      • 2013-06-25
      相关资源
      最近更新 更多