package io.prometheus.client.logback;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import io.prometheus.client.Counter;
public class InstrumentedAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
public static final String COUNTER_NAME = "logback_appender_total";
private static final Counter COUNTER;
private static final Counter.Child TRACE_LABEL;
private static final Counter.Child DEBUG_LABEL;
private static final Counter.Child INFO_LABEL;
private static final Counter.Child WARN_LABEL;
private static final Counter.Child ERROR_LABEL;
static {
COUNTER = Counter.build().name(COUNTER_NAME)
.help("Logback log statements at various log levels")
.labelNames("level")
.register();
TRACE_LABEL = COUNTER.labels("trace");
DEBUG_LABEL = COUNTER.labels("debug");
INFO_LABEL = COUNTER.labels("info");
WARN_LABEL = COUNTER.labels("warn");
ERROR_LABEL = COUNTER.labels("error");
}
/**
* Create a new instrumented appender using the default registry.
*/
public InstrumentedAppender() {
}
@Override
public void start() {
super.start();
}
@Override
protected void append(ILoggingEvent event) {
switch (event.getLevel().toInt()) {
case Level.TRACE_INT:
TRACE_LABEL.inc();
break;
case Level.DEBUG_INT:
DEBUG_LABEL.inc();
break;
case Level.INFO_INT:
INFO_LABEL.inc();
break;
case Level.WARN_INT:
WARN_LABEL.inc();
break;
case Level.ERROR_INT:
ERROR_LABEL.inc();
break;
default:
break;
}
}
}