如果记录了某些错误,请将Logback配置为通过电子邮件发送整个日志

时间:2014-11-22 21:08:30

标签: java slf4j logback

我正在使用MDC和密钥"requestId"来跟踪传入的请求。我现在想使用SMTPAppender向我发送一封邮件,其中包含给定请求的整个日志,如果有任何行处于错误级别。

我知道我可以使用MDC鉴别器在请求ID之后对日志行进行分组。问题是SMTPAppender第一个错误时通过电子邮件发送请求的日志。我希望也包含该请求的后续日志行。

我不介意在每个请求后放置一个标记(但我更喜欢将它放在TRACE级别)。即在每次请求之后,我都不介意做

logger.trace(MarkerFactory.getMarker("END_OF_REQUEST"), "End of request");

“刷新”电子邮件。

(我已经尝试创建自己的评估器,但是我不能让它与鉴别器一起发挥得很好。)

1 个答案:

答案 0 :(得分:0)

我想我设法按如下方式解决了这个问题:

public class MyEvaluator extends ContextAwareBase
                         implements EventEvaluator<ILoggingEvent> {

    private String name;
    private boolean started;
    private Set<String> requestIdsWithErrors = new HashSet<>();

    public boolean evaluate(ILoggingEvent event) {

        String requestId = MDC.get("requestId");
        boolean result = false;

        if (event.getLevel().levelInt >= Level.ERROR_INT)
            requestIdsWithErrors.add(requestId);

        Marker marker = event.getMarker();
        if (marker != null && marker.getName().equals("END_OF_REQUEST"))
            result = requestIdsWithErrors.remove(requestId);

        return result;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public boolean isStarted() { return started; }
    public void start() { started = true; }
    public void stop() { started = false; }
}

我希望我可以利用SMTPAppender的判别器机制(并将requestIdsWithErrors集替换为boolean)。如果有人知道如何做到这一点,我会感激,如果有人发布了答案......