|
Akka/Scala example source code file (Slf4jLoggerSpec.scala)
The Slf4jLoggerSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.event.slf4j
import language.postfixOps
import akka.testkit.AkkaSpec
import akka.actor.{ DiagnosticActorLogging, Actor, ActorLogging, Props }
import scala.concurrent.duration._
import akka.event.Logging
import ch.qos.logback.core.OutputStreamAppender
import java.io.StringWriter
import java.io.ByteArrayOutputStream
import org.scalatest.BeforeAndAfterEach
object Slf4jLoggerSpec {
// This test depends on logback configuration in src/test/resources/logback-test.xml
val config = """
akka {
loglevel = INFO
loggers = ["akka.event.slf4j.Slf4jLogger"]
logger-startup-timeout = 30s
}
"""
class LogProducer extends Actor with DiagnosticActorLogging {
def receive = {
case e: Exception ⇒
log.error(e, e.getMessage)
case (s: String, x: Int, y: Int) ⇒
log.info(s, x, y)
case (s: String, mdc: Map[String, Any]) ⇒
log.mdc(mdc)
log.info(s)
log.clearMDC()
}
}
class MyLogSource
val output = new ByteArrayOutputStream
def outputString: String = output.toString("UTF-8")
class TestAppender extends OutputStreamAppender {
override def start(): Unit = {
setOutputStream(output)
super.start()
}
}
}
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class Slf4jLoggerSpec extends AkkaSpec(Slf4jLoggerSpec.config) with BeforeAndAfterEach {
import Slf4jLoggerSpec._
val producer = system.actorOf(Props[LogProducer], name = "logProducer")
override def beforeEach(): Unit = {
output.reset()
}
val sourceThreadRegex = "sourceThread=\\[Slf4jLoggerSpec-akka.actor.default-dispatcher-[1-9][0-9]*\\]"
"Slf4jLogger" must {
"log error with stackTrace" in {
producer ! new RuntimeException("Simulated error")
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[akka://Slf4jLoggerSpec/user/logProducer]")
s should include("level=[ERROR]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec$LogProducer]")
s should include regex (sourceThreadRegex)
s should include("msg=[Simulated error]")
s should include("java.lang.RuntimeException: Simulated error")
s should include("at akka.event.slf4j.Slf4jLoggerSpec")
}
"log info with parameters" in {
producer ! (("test x={} y={}", 3, 17))
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[akka://Slf4jLoggerSpec/user/logProducer]")
s should include("level=[INFO]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec$LogProducer]")
s should include regex (sourceThreadRegex)
s should include("msg=[test x=3 y=17]")
}
"put custom MDC values when specified" in {
producer ! ("Message with custom MDC values", Map("ticketNumber" -> 3671, "ticketDesc" -> "Custom MDC Values"))
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[akka://Slf4jLoggerSpec/user/logProducer]")
s should include("level=[INFO]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec$LogProducer]")
s should include regex (sourceThreadRegex)
s should include("mdc=[ticket-#3671: Custom MDC Values]")
s should include("msg=[Message with custom MDC values]")
}
"Support null values in custom MDC" in {
producer ! ("Message with null custom MDC values", Map("ticketNumber" -> 3671, "ticketDesc" -> null))
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[akka://Slf4jLoggerSpec/user/logProducer]")
s should include("level=[INFO]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec$LogProducer]")
s should include regex (sourceThreadRegex)
s should include("mdc=[ticket-#3671: null]")
s should include("msg=[Message with null custom MDC values]")
}
"include system info in akkaSource when creating Logging with system" in {
val log = Logging(system, "akka.event.slf4j.Slf4jLoggerSpec.MyLogSource")
log.info("test")
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[akka.event.slf4j.Slf4jLoggerSpec.MyLogSource(akka://Slf4jLoggerSpec)]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec.MyLogSource(akka://Slf4jLoggerSpec)]")
}
"not include system info in akkaSource when creating Logging with system.eventStream" in {
val log = Logging(system.eventStream, "akka.event.slf4j.Slf4jLoggerSpec.MyLogSource")
log.info("test")
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[akka.event.slf4j.Slf4jLoggerSpec.MyLogSource]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec.MyLogSource]")
}
"use short class name and include system info in akkaSource when creating Logging with system and class" in {
val log = Logging(system, classOf[MyLogSource])
log.info("test")
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[Slf4jLoggerSpec$MyLogSource(akka://Slf4jLoggerSpec)]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec$MyLogSource]")
}
"use short class name in akkaSource when creating Logging with system.eventStream and class" in {
val log = Logging(system.eventStream, classOf[MyLogSource])
log.info("test")
awaitCond(outputString.contains("----"), 5 seconds)
val s = outputString
s should include("akkaSource=[Slf4jLoggerSpec$MyLogSource]")
s should include("logger=[akka.event.slf4j.Slf4jLoggerSpec$MyLogSource]")
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka Slf4jLoggerSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.