Logging auto derivation
The problem
Section titled “The problem”Often you see that in well modularized apps log messages are quite the same:
def method(args: Args) = for { _ <- info"Started method with $args" result <- foo(bar(args)) _ <- info"Ended method with $result"} yield result
tofu.logging
allows to automatically generate those lines about entering and exiting the method.
Autogenerated logging
Section titled “Autogenerated logging”You can automatically generate log messages stating when the method of some service has been entered and left.
import tofu.higherKind.derived.representableKimport derevo.deriveimport tofu.logging.derivation._import tofu.logging.Logging
@derive(representableK, loggingMid)trait MyService[F[_]] { def makeThis: F[Unit]
def makeThat(arg1: Int, arg2: String): F[Long]}
object MyService extends Logging.Companion[MyService] {
def make[F[_] : Logging.Make : Monad]: MyService[F] = { val core = new Impl[F] core.attachLogs }
class Impl[F[_] : Monad] extends MyService[F] { //implementation }}
There is also an alternative — loggingMidErr which also logs any error happened during method execution.
How it works
Section titled “How it works”The idea is based on the Mid concept. For every method def foo(bar: Bar): F[Baz] = impl
it generates
it’s logging compartment, looking close to that:
def foo(bar: Bar): F[Baz] = debug"Entering foo with $bar" *> impl <* debug"Exiting foo with $baz"
Example
Section titled “Example”Check out the example here.