|
Akka/Scala example source code file (LoggerSpec.scala)
The LoggerSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.event
import akka.testkit._
import scala.concurrent.duration._
import com.typesafe.config.{ Config, ConfigFactory }
import akka.actor._
import java.util.{ Date, GregorianCalendar, TimeZone, Calendar }
import org.scalatest.WordSpec
import org.scalatest.Matchers
import akka.serialization.SerializationExtension
import akka.event.Logging._
import akka.util.Helpers
import akka.event.Logging.InitializeLogger
import scala.Some
import akka.event.Logging.Warning
object LoggerSpec {
val defaultConfig = ConfigFactory.parseString("""
akka {
stdout-loglevel = "WARNING"
loglevel = "DEBUG"
loggers = ["akka.event.LoggerSpec$TestLogger1"]
}
""").withFallback(AkkaSpec.testConf)
val noLoggingConfig = ConfigFactory.parseString("""
akka {
stdout-loglevel = "OFF"
loglevel = "OFF"
loggers = ["akka.event.LoggerSpec$TestLogger1"]
}
""").withFallback(AkkaSpec.testConf)
val multipleConfig = ConfigFactory.parseString("""
akka {
stdout-loglevel = "OFF"
loglevel = "WARNING"
loggers = ["akka.event.LoggerSpec$TestLogger1", "akka.event.LoggerSpec$TestLogger2"]
}
""").withFallback(AkkaSpec.testConf)
val ticket3165Config = ConfigFactory.parseString("""
akka {
stdout-loglevel = "WARNING"
loglevel = "DEBUG"
loggers = ["akka.event.LoggerSpec$TestLogger1"]
actor {
serialize-messages = on
serialization-bindings {
"akka.event.Logging$LogEvent" = bytes
"java.io.Serializable" = java
}
}
}
""").withFallback(AkkaSpec.testConf)
val ticket3671Config = ConfigFactory.parseString("""
akka {
stdout-loglevel = "WARNING"
loglevel = "WARNING"
loggers = ["akka.event.LoggerSpec$TestLogger1"]
actor {
serialize-messages = off
}
}
""").withFallback(AkkaSpec.testConf)
final case class SetTarget(ref: ActorRef, qualifier: Int)
class TestLogger1 extends TestLogger(1)
class TestLogger2 extends TestLogger(2)
abstract class TestLogger(qualifier: Int) extends Actor with Logging.StdOutLogger {
var target: Option[ActorRef] = None
override def receive: Receive = {
case InitializeLogger(bus) ⇒
bus.subscribe(context.self, classOf[SetTarget])
sender() ! LoggerInitialized
case SetTarget(ref, `qualifier`) ⇒
target = Some(ref)
ref ! ("OK")
case event: LogEvent if !event.mdc.isEmpty ⇒
print(event)
target foreach { _ ! event }
case event: LogEvent ⇒
print(event)
target foreach { _ ! event.message }
}
}
class ActorWithMDC extends Actor with DiagnosticActorLogging {
var reqId = 0
override def mdc(currentMessage: Any): MDC = {
reqId += 1
val always = Map("requestId" -> reqId)
val perMessage = currentMessage match {
case cm @ "Current Message in MDC" ⇒ Map("currentMsg" -> cm, "currentMsgLength" -> cm.length)
case _ ⇒ Map()
}
always ++ perMessage
}
def receive: Receive = {
case m: String ⇒ log.warning(m)
}
}
}
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class LoggerSpec extends WordSpec with Matchers {
import LoggerSpec._
private def createSystemAndLogToBuffer(name: String, config: Config, shouldLog: Boolean) = {
val out = new java.io.ByteArrayOutputStream()
Console.withOut(out) {
implicit val system = ActorSystem(name, config)
try {
val probe = TestProbe()
system.eventStream.publish(SetTarget(probe.ref, qualifier = 1))
probe.expectMsg("OK")
system.log.error("Danger! Danger!")
// since logging is asynchronous ensure that it propagates
if (shouldLog) {
probe.fishForMessage(0.5.seconds.dilated) {
case "Danger! Danger!" ⇒ true
case _ ⇒ false
}
} else {
probe.expectNoMsg(0.5.seconds.dilated)
}
} finally {
TestKit.shutdownActorSystem(system)
}
}
out
}
"A normally configured actor system" must {
"log messages to standard output" in {
val out = createSystemAndLogToBuffer("defaultLogger", defaultConfig, true)
out.size should be > (0)
}
}
"An actor system configured with the logging turned off" must {
"not log messages to standard output" in {
val out = createSystemAndLogToBuffer("noLogging", noLoggingConfig, false)
out.size should be(0)
}
}
"An actor system configured with multiple loggers" must {
"use several loggers" in {
Console.withOut(new java.io.ByteArrayOutputStream()) {
implicit val system = ActorSystem("multipleLoggers", multipleConfig)
try {
val probe1 = TestProbe()
val probe2 = TestProbe()
system.eventStream.publish(SetTarget(probe1.ref, qualifier = 1))
probe1.expectMsg("OK")
system.eventStream.publish(SetTarget(probe2.ref, qualifier = 2))
probe2.expectMsg("OK")
system.log.warning("log it")
probe1.expectMsg("log it")
probe2.expectMsg("log it")
} finally {
TestKit.shutdownActorSystem(system)
}
}
}
}
"Ticket 3671" must {
"log message with given MDC values" in {
implicit val system = ActorSystem("ticket-3671", ticket3671Config)
try {
val probe = TestProbe()
system.eventStream.publish(SetTarget(probe.ref, qualifier = 1))
probe.expectMsg("OK")
val ref = system.actorOf(Props[ActorWithMDC])
ref ! "Processing new Request"
probe.expectMsgPF(max = 3.seconds) {
case w @ Warning(_, _, "Processing new Request") if w.mdc.size == 1 && w.mdc("requestId") == 1 ⇒
}
ref ! "Processing another Request"
probe.expectMsgPF(max = 3.seconds) {
case w @ Warning(_, _, "Processing another Request") if w.mdc.size == 1 && w.mdc("requestId") == 2 ⇒
}
ref ! "Current Message in MDC"
probe.expectMsgPF(max = 3.seconds) {
case w @ Warning(_, _, "Current Message in MDC") if w.mdc.size == 3 &&
w.mdc("requestId") == 3 &&
w.mdc("currentMsg") == "Current Message in MDC" &&
w.mdc("currentMsgLength") == 22 ⇒
}
ref ! "Current Message removed from MDC"
probe.expectMsgPF(max = 3.seconds) {
case w @ Warning(_, _, "Current Message removed from MDC") if w.mdc.size == 1 && w.mdc("requestId") == 4 ⇒
}
} finally {
TestKit.shutdownActorSystem(system)
}
}
}
"Ticket 3080" must {
"format currentTimeMillis to a valid UTC String" in {
val timestamp = System.currentTimeMillis
val c = new GregorianCalendar(TimeZone.getTimeZone("UTC"))
c.setTime(new Date(timestamp))
val hours = c.get(Calendar.HOUR_OF_DAY)
val minutes = c.get(Calendar.MINUTE)
val seconds = c.get(Calendar.SECOND)
val ms = c.get(Calendar.MILLISECOND)
Helpers.currentTimeMillisToUTCString(timestamp) should be(f"$hours%02d:$minutes%02d:$seconds%02d.$ms%03dUTC")
}
}
"Ticket 3165 - serialize-messages and dual-entry serialization of LogEvent" must {
"not cause StackOverflowError" in {
implicit val s = ActorSystem("foo", ticket3165Config)
try {
SerializationExtension(s).serialize(Warning("foo", classOf[String]))
} finally {
TestKit.shutdownActorSystem(s)
}
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka LoggerSpec.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.