Last active
December 21, 2015 01:49
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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