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}