Skip to content

Instantly share code, notes, and snippets.

@mike-duvall
Last active December 21, 2015 01:49
Show Gist options
  • Save mike-duvall/6230431 to your computer and use it in GitHub Desktop.
Save mike-duvall/6230431 to your computer and use it in GitHub Desktop.
For a specific JUnit integration test I was coding, I wanted the test to fail if an errors were logged to logback. I created this appender to record if errors were logged. Once the test is finished, the JUnit test asks the appender if errors were logged and fails the test if so.
import java.io.IOException;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class LogLevelTripwireAppender extends AppenderBase<ILoggingEvent> {
private PatternLayoutEncoder encoder;
private boolean thresholdWasReached = false;
private Level logLevelThreshold;
public LogLevelTripwireAppender(Level aLogLevel) {
this.logLevelThreshold = aLogLevel;
}
@Override
public void start() {
if( !isEncoderValid())
return;
try {
encoder.init(System.out);
} catch (IOException e) {
throw new RuntimeException(e);
}
super.start();
}
private boolean isEncoderValid() {
boolean isValid = true;
if (this.encoder == null) {
addError("No encoder set for the appender named ["+ name +"].");
isValid = false;
}
return isValid;
}
public void append(ILoggingEvent event) {
Level eventLevel = event.getLevel();
if( eventLevel.isGreaterOrEqual(this.logLevelThreshold)) {
thresholdWasReached = true;
}
}
public boolean wasThresholdReached() {
return this.thresholdWasReached;
}
public void setEncoder(PatternLayoutEncoder anEncoder) {
this.encoder = anEncoder;
}
}
-------------------------
Example usage
private LogLevelTripwireAppender appender
private void setupAppender() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
appender = new LogLevelTripwireAppender(Level.WARN);
appender.setContext(loggerContext);
PatternLayoutEncoder encoder = createEncoder(loggerContext);
appender.setEncoder(encoder);
appender.start();
Logger logbackLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
logbackLogger.addAppender(appender);
}
private PatternLayoutEncoder createEncoder(LoggerContext loggerContext) {
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");
encoder.start();
return encoder;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment