Запустите пользовательский метод, когда log4.2 logger.error () запущен в Spring Boot - PullRequest
0 голосов
/ 01 февраля 2020

Я использую Spring Boot с log4j2 - и я хотел бы вызвать пользовательский метод в классе '@Service' при срабатывании logger.error(...).

Например,

@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 с Spring Boot. Дело в том, что я просто хочу вызвать метод по умолчанию logger.error(...), поскольку Я не хочу изменять поведение по умолчанию log4j2 . Я немного исследовал - и filter или adapter может быть решением здесь, но я не совсем уверен, как этого добиться. Пожалуйста, помогите мне!

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Хотя приложение будет работать так, как предлагает Марк, я бы применил фильтр. Фильтр может быть размещен в четырех разных местах в Log4j 2 и имеет возможность принудительно регистрировать событие журнала, чтобы оно не регистрировалось, или просто продолжать обычную оценку того, должно ли оно быть зарегистрировано. Но фильтр всегда можно настроить с помощью onMatch = NEUTRAL и onMismatch = NEUTRAL, чтобы он действительно не влиял на то, обрабатывается ли событие журнала, но позволяет выполнять некоторую другую обработку. Кроме того, фильтры гораздо проще написать, чем Appender.

Образец фильтра можно найти по адресу http://logging.apache.org/log4j/2.x/manual/extending.html#Filters

Что не следует делать в фильтре, так это использовать его как способ записи события журнала в какой-то пункт назначения. Это именно то, для чего нужны Appenders.

1 голос
/ 01 февраля 2020

IMO, самый простой способ достичь этого - создать специальный аппендер и в конфигурации Log4j2 связать его с выбранным вами регистратором (или, возможно, со всеми регистраторами, если вам нужна «глобальная» конфигурация).

Тогда вы могли бы использовать «фильтр приложения», чтобы вызвать вызов приложения, только если это сообщение об ошибке.

Единственная потенциальная проблема - это обращение к пружинному компоненту из приложения log4j2. Прочтите этот поток SO , чтобы понять, как технически вы можете этого достичь.

Преимущество этого метода заключается в том, что вы не изменяете платформу, а вместо этого используете уже имеющиеся опции конфигурации.

...