package de.flower.common.logging;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluatorBase;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Class to throttle sending of mails through logbacks SMTPAppender.
*
* @author flowerrrr
*/
public class SMTPEvaluator extends EventEvaluatorBase<ILoggingEvent> {
private Date lastTriggerDate;
/**
* Min time between two mails. 1 h.
*/
private static final long idleTimeSecs = TimeUnit.HOURS.toMillis(1);
/**
* List of regex expressions to match against event. if match ignore event.
*/
private List<String> excludes = new ArrayList<>();
public SMTPEvaluator() {
// let app sent email on this message. helps to verify that email sending is working.
// excludes.add(".*\\QIllegal argument on static metamodel field injection : de.flower.rmt.model.event.AbstractSoccerEvent_#surfaceList\\E.*");
}
@Override
public boolean evaluate(final ILoggingEvent event) throws NullPointerException, EvaluationException {
// event to be ignored?
if (ignoreEvent(event)) {
return false;
} else if (insideIdlePeriod()) {
return false;
} else {
lastTriggerDate = new Date();
return true;
}
}
private boolean insideIdlePeriod() {
if (lastTriggerDate == null) {
return false;
} else {
long diff = new Date().getTime() - lastTriggerDate.getTime();
return (diff < idleTimeSecs);
}
}
private boolean ignoreEvent(final ILoggingEvent event) {
String msg = event.getFormattedMessage();
for (String exclude : excludes) {
if (msg.matches(exclude)) {
return true;
}
}
return false;
}
}