Java 当log4j2';s logger.error()在Spring引导中触发

Java 当log4j2';s logger.error()在Spring引导中触发,java,spring,spring-boot,log4j2,Java,Spring,Spring Boot,Log4j2,我使用的是带有log4j2的Spring引导,我想在触发logger.error(…)时触发'@Service'类中的一个自定义方法 比如说, @Service public class Foo { private final Logger logger = LogManager.getLogger(getClass()); ... public void doSomething() { try { ... }

我使用的是带有log4j2的Spring引导,我想在触发
logger.error(…)
时触发'@Service'类中的一个自定义方法

比如说,

@Service
public class Foo {
    private final Logger logger = LogManager.getLogger(getClass());
    ...
    public void doSomething() {
        try {
            ...
        }
        catch (Exception e) {
            logger.error("Error!", e); // When `error` is triggered...
        }
    }
}

// Other class
@Service
public class Bar {
    @Autowired private NotificationService notificationService;

    public void triggeredOnError() { // I'd like to trigger this method
        this.notificationService.notifySomething();
    }
}


我想知道这在log4j2和springboot中是可能的。问题是,我只想触发默认方法
logger.error(…)
,因为我不想更改log4j2的默认行为。我研究了一个bit-and
filter
adapter
可能是这里的解决方案,但我不确定如何实现这一点。请帮帮我

IMO实现这一点的最简单方法是创建一个特殊的appender,并在Log4j2配置中将其与您选择的记录器相关联(如果您想要“全局”配置,也可以与所有记录器相关联)

然后,您可以使用“appender筛选器”仅在出现错误消息时调用appender

唯一的潜在问题是从log4j2appender联系Springbean。阅读以了解如何在技术上实现这一点


这种方法的好处是,您不需要更改框架,而是利用它已经提供的配置选项

虽然appender可以像Mark建议的那样工作,但我会实现一个过滤器。过滤器可放置在Log4j 2中的四个不同位置,并可选择强制记录日志事件、强制不记录日志事件或继续正常评估是否应记录日志事件。但是过滤器总是可以配置为onMatch=NEUTRAL和onMismatch=NEUTRAL,这样它实际上对日志事件是否被处理没有影响,但允许进行一些其他处理。此外,过滤器比附加器更容易编写

您可以在以下位置找到示例过滤器:


不过,您不应该在筛选器中使用它作为将日志事件写入某个目标的方式。这正是Appender的用途。

您可以使用Java logging util而不是Log4j吗?如果可以,我可以为您的场景提供一种方法,顺便说一句,Java logging util(jdk 11)与log4j@MehrdadHosseinNejad说java.util.logging与log4j完全相似是胡说八道。jul不支持标记,不支持参数化格式字符串,只支持日志字符串,而不像Log4j那样支持消息,不附带多个处理程序,不具有线程上下文(又名MDC)的等价物,等等。此外,所有的性能测试都表明jul的性能非常糟糕,并且很难将其他日志框架与之集成。这个问题可以有很多有效的答案,而“最好的”答案主要是意见问题。我明白了-所以我想使用的是
过滤器
-非常感谢Hanks的回答,你的答案也很有帮助!