2
votes

Can someone share a minimal akka typed logging example? In akka classic I used LoggingReceive and set in src/main/resources/application.conf

akka {
  loglevel = DEBUG
  actor {
    debug {
      receive=on
    }
  }
}

but in Akka typed I'm unclear what to do. If possible, I'd like the logging to work with akka.actor.testkit as well

I tried just simply adding as suggested here

Behaviors.receive[String] { (ctx, message) =>
  ctx.log.info("Received message: {}", message)
  Behaviors.same
}

But nothing is printed which makes me think I might need to configure the backend somehow, perhaps with logback.xml (although I didn't understand this)

1

1 Answers

0
votes

you can use the ConfigFactory.load().getConfig() and load a specific configuration to your application.

Like this is my application.conf:

akka.actor.allow-java-serialization = on
mySpecialConfig {
    akka {
        loglevel = DEBUG
    }
}

and my application where I can call context.log.debug() directly because the AbstractBehavior already extends ActorLogging.

import akka.actor.typed._
import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors}
import com.typesafe.config.ConfigFactory

object CounterActorTypedDemo {
  def main(args: Array[String]): Unit = {
    run()
  }

  def run(): Unit = {

    import Counter._

    val specialConfig = ConfigFactory.load().getConfig("mySpecialConfig")
    val countActor = ActorSystem(CounterActorTyped(), "CounterSystem", specialConfig)
    (1 to 5).foreach(_ => countActor ! Increment)
    (1 to 3).foreach(_ => countActor ! Decrement)
    countActor ! Print

    Thread.sleep(5000)
    countActor.terminate
  }
}

object Counter {

  trait CounterMsg

  final case object Print extends CounterMsg

  final case object Increment extends CounterMsg

  final case object Decrement extends CounterMsg

}

object CounterActorTyped {
  def apply(): Behavior[Counter.CounterMsg] = Behaviors.setup[Counter.CounterMsg](context => new CounterActorTyped(context))
}

class CounterActorTyped(context: ActorContext[Counter.CounterMsg]) extends AbstractBehavior[Counter.CounterMsg](context) {
  context.log.info("Counter Application started")
  var count = 0

  import Counter._

  override def onMessage(msg: CounterMsg): Behavior[CounterMsg] = msg match {
    case Increment =>
      context.log.debug(s"incrementing $count ...")
      count += 1
      Behaviors.same
    case Decrement =>
      context.log.debug(s"decrementing $count ...")
      count -= 1
      Behaviors.same
    case Print =>
      context.log.debug(s"current count is: $count")
      Behaviors.same
  }

  override def onSignal: PartialFunction[Signal, Behavior[CounterMsg]] = {
    case PostStop =>
      context.log.info("Counter Application stopped")
      this
  }
}

the logs will appear on the console like this:

org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTypedDemo
    10:00:35.944 [CounterSystem-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
    10:00:35.946 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.event.EventStream - logger log1-Slf4jLogger started
    10:00:35.951 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.event.EventStream - Default Loggers started
    SLF4J: A number (3) of logging calls during the initialization phase have been intercepted and are
    SLF4J: now being replayed. These are subject to the filtering rules of the underlying logging system.
    SLF4J: See also http://www.slf4j.org/codes.html#replay
    10:00:36.219 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.serialization.Serialization(akka://CounterSystem) - Replacing JavaSerializer with DisabledJavaSerializer, due to `akka.actor.allow-java-serialization = off`.
    10:00:36.762 [CounterSystem-akka.actor.default-dispatcher-3] INFO org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - Counter Application started
    10:00:36.763 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - incrementing 0 ...
    10:00:36.763 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - incrementing 1 ...
    10:00:36.763 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - incrementing 2 ...
    10:00:36.764 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - incrementing 3 ...
    10:00:36.764 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - incrementing 4 ...
    10:00:36.764 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - decrementing 5 ...
    10:00:36.765 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - decrementing 4 ...
    10:00:36.765 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - decrementing 3 ...
    10:00:36.765 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - current count is: 2
    10:00:41.780 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Running CoordinatedShutdown with reason [ActorSystemTerminateReason]
    10:00:41.780 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [before-service-unbind] with [0] tasks
    10:00:41.788 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [service-unbind] with [0] tasks
    10:00:41.789 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [service-requests-done] with [0] tasks
    10:00:41.789 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [service-stop] with [0] tasks
    10:00:41.789 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [before-cluster-shutdown] with [0] tasks
    10:00:41.789 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [cluster-sharding-shutdown-region] with [0] tasks
    10:00:41.790 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [cluster-leave] with [0] tasks
    10:00:41.790 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [cluster-exiting] with [0] tasks
    10:00:41.790 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [cluster-exiting-done] with [0] tasks
    10:00:41.790 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [cluster-shutdown] with [0] tasks
    10:00:41.790 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [before-actor-system-terminate] with [0] tasks
    10:00:41.791 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing phase [actor-system-terminate] with [1] tasks.
    10:00:41.793 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.actor.CoordinatedShutdown - Performing task [terminate-system] in CoordinatedShutdown phase [actor-system-terminate]
    10:00:41.800 [CounterSystem-akka.actor.default-dispatcher-3] INFO org.github.felipegutierrez.explore.akka.typed.basics.CounterActorTyped - Counter Application stopped
    10:00:41.819 [CounterSystem-akka.actor.default-dispatcher-3] DEBUG akka.event.EventStream - shutting down: StandardOutLogger
    
    Process finished with exit code 0