app/monitoring/SentryLogging.scala (31 lines of code) (raw):

package monitoring import ch.qos.logback.classic.filter.ThresholdFilter import ch.qos.logback.classic.{Logger, LoggerContext} import com.getsentry.raven.RavenFactory.ravenInstance import com.getsentry.raven.dsn.Dsn import com.getsentry.raven.logback.SentryAppender import org.slf4j.Logger.ROOT_LOGGER_NAME import org.slf4j.LoggerFactory import play.api.Logging class SentryLogging( config: play.api.Configuration ) extends Logging { val dsnOpt: Option[Dsn] = config.getOptional[String]("sentry.dsn").map(new Dsn(_)) def init(): Unit = dsnOpt match { case None => logger.warn("No Sentry logging configured (OK for dev)") case Some(dsn) => logger.info(s"Initialising Sentry logging for ${dsn.getHost}") val tags = Map("gitCommitId" -> app.BuildInfo.gitCommitId) val tagsString = tags.map { case (key, value) => s"$key:$value" }.mkString(",") val filter = new ThresholdFilter { setLevel("ERROR") } filter.start() // OMG WHY IS THIS NECESSARY LOGBACK? val sentryAppender = new SentryAppender(ravenInstance(dsn)) { addFilter(filter) setTags(tagsString) setContext(LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]) } sentryAppender.start() LoggerFactory.getLogger(ROOT_LOGGER_NAME).asInstanceOf[Logger].addAppender(sentryAppender) } }