Para resolver el mismo problema he escrito un evaluador personalizado. Extiende ch.qos.logback.classic.boolex.OnMarkerEvaluator, pero puede usar cualquier otro evaluador como base. Si hay muchos mensajes aceptables en el intervalo de silencio, el evaluador los descartará. Para mi caso de uso, está bien, pero si necesita un comportamiento diferente, simplemente agregue verificaciones adicionales al segundo si.
public class LimitingOnMarkerEvaluator extends OnMarkerEvaluator {
private long lastSend = 0, interval = 0;
@Override
public boolean evaluate(ILoggingEvent event) throws EvaluationException {
if (super.evaluate(event)) {
long now = System.currentTimeMillis();
if (now - lastSend > interval) {
lastSend = now;
return true;
}
}
return false;
}
public long getInterval() {
return interval;
}
public void setInterval(long interval) {
this.interval = interval;
}
}
Config para enviar un máximo de un mensaje cada 1.000 segundo (unos 17 minutos):
<evaluator class="package.LimitingOnMarkerEvaluator">
<marker>FATAL</marker>
<interval>1000000</interval>
</evaluator>
La limitación de velocidad es uno de esos problemas frustrantemente difíciles de resolver. Me sorprendería si logback tuviera una solución simple para esto. – skaffman
@skaffman, ¿puedes explicar la complejidad? Entiendo que esto puede ocultar algunos fallos, en caso de que ocurra un error crítico ligeramente después de un error menos crítico. – notnoop