001package io.prometheus.client.log4j;
002
003import io.prometheus.client.Counter;
004import org.apache.log4j.AppenderSkeleton;
005import org.apache.log4j.Level;
006import org.apache.log4j.spi.LoggingEvent;
007
008public class InstrumentedAppender extends AppenderSkeleton {
009
010  public static final String COUNTER_NAME = "log4j_appender_total";
011
012  private static final Counter COUNTER;
013  private static final Counter.Child TRACE_LABEL;
014  private static final Counter.Child DEBUG_LABEL;
015  private static final Counter.Child INFO_LABEL;
016  private static final Counter.Child WARN_LABEL;
017  private static final Counter.Child ERROR_LABEL;
018  private static final Counter.Child FATAL_LABEL;
019  
020  static {
021    COUNTER = Counter.build().name(COUNTER_NAME)
022            .help("Log4j log statements at various log levels")
023            .labelNames("level")
024            .register();
025
026    TRACE_LABEL = COUNTER.labels("trace");
027    DEBUG_LABEL = COUNTER.labels("debug");
028    INFO_LABEL = COUNTER.labels("info");
029    WARN_LABEL = COUNTER.labels("warn");
030    ERROR_LABEL = COUNTER.labels("error");
031    FATAL_LABEL = COUNTER.labels("fatal");
032  }
033
034  /**
035   * Create a new instrumented appender using the default registry.
036   */
037  public InstrumentedAppender() {
038  }
039
040
041  @Override
042  public void activateOptions() {
043  }
044
045  @Override
046  protected void append(LoggingEvent event) {
047    switch (event.getLevel().toInt()) {
048      case Level.TRACE_INT:
049        TRACE_LABEL.inc();
050        break;
051      case Level.DEBUG_INT:
052        DEBUG_LABEL.inc();
053        break;
054      case Level.INFO_INT:
055        INFO_LABEL.inc();
056        break;
057      case Level.WARN_INT:
058        WARN_LABEL.inc();
059        break;
060      case Level.ERROR_INT:
061        ERROR_LABEL.inc();
062        break;
063      case Level.FATAL_INT:
064        FATAL_LABEL.inc();
065        break;
066      default:
067        break;
068    }
069  }
070
071  @Override
072  public void close() {
073    // nothing doing
074  }
075
076  @Override
077  public boolean requiresLayout() {
078    return false;
079  }
080}