Skip to content

Instantly share code, notes, and snippets.

@fanf
Created July 17, 2019 21:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fanf/d09ff722822ddab62551c62415959af2 to your computer and use it in GitHub Desktop.
Save fanf/d09ff722822ddab62551c62415959af2 to your computer and use it in GitHub Desktop.
Programatically set ByteArrayOutputStream appender for logback logger in scala
// this was driving me crazy, so here we are, for everyone.
// inspiration from https://stackoverflow.com/questions/19058722/creating-an-outputstreamappender-for-logback
import ch.qos.logback.classic.Logger
import ch.qos.logback.classic.LoggerContext
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.OutputStreamAppender
import org.slf4j.LoggerFactory
import scala.collection.JavaConverters._
// .... somewhere in your code ....
// get your logger
val log = LoggerFactory.getLogger("....").asInstanceOf[Logger]
val ctx = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]
val encoder = new PatternLayoutEncoder() // this is mandatory. Without that, nothing happens silently
encoder.setContext(ctx) // order of setters matters
encoder.setPattern("%msg%n") // and if you miss that... nothing happens silently
encoder.start() // don't forget start!
val os = new ByteArrayOutputStream()
val appender = new OutputStreamAppender[ILoggingEvent]()
appender.setImmediateFlush(true)
appender.setName("test-byte-array")
appender.setContext(ctx) // context must be set first
appender.setEncoder(encoder) // then encoder
appender.setOutputStream(os) // then output stream
appender.start() // don't forget start!
// if you want to remove other appenders
log.iteratorForAppenders().asScala.foreach { a =>
log.detachAppender(a)
a.stop()
}
log.setAdditive(false) // disable root logger/appender
// actually add you new appender
log.addAppender(appender)
// exec ...
log.error("ohno! An error!")
val output = os.toString(StandardCharsets.UTF_8)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment