How to customise logging in tapir?

306 views Asked by At

I'm sure this is a ridiculous question... I'm trying to enable tapir's logging as described here:

https://tapir.softwaremill.com/en/v0.19.0-m4/server/debugging.html

... but even having looked at the ServerOptions docs, I'm not getting anywhere. My naive assumption from the docs was that it should be something like:

import sttp.tapir.server.akkahttp.AkkaHttpServerOptions
import sttp.tapir.server.interceptor.log.DefaultServerLog

val customServerOptions: AkkaHttpServerOptions = AkkaHttpServerOptions.customInterceptors(
    serverLog = DefaultServerLog(logWhenHandled=true, logAllDecodeFailures=true)
)

and then

AkkaHttpServerInterpreter(customServerOptions).toRoute(...)

However, this is clearly way off - DefaultServerLog is the wrong type, and would need masses of configuration.

The docs imply this can just be done by setting a few flags, what am I missing?

1

There are 1 answers

1
adamw On BEST ANSWER

The DefaultServerLog is the default implementation for the ServerLog trait, though it has a couple of fields without default values. These fields specify how to actually perform the logging: DefaultServerLog .doLogWhenHandled etc.

What you need to do is to get an instance of DefaultServerLog, which is configured to integrate with akka-http. This is available as AkkaHttpServerOptions.Log.defaultServerLog.

Unfortunately, in 0.19 this was typed too narrowly, not allowing proper customisation. Hence, an ugly cast is needed (this is fixed in the current, stable 1.2 version):

val customServerOptions: AkkaHttpServerOptions = 
  AkkaHttpServerOptions.customInterceptors(
    serverLog = Some(
      AkkaHttpServerOptions.Log.defaultServerLog
        .asInstanceOf[DefaultServerLog[LoggingAdapter => Future[Unit]]]
        .copy(logWhenHandled = true, logAllDecodeFailures = true)
    )
  )

AkkaHttpServerInterpreter(customServerOptions).toRoute(???)

As for the docs, you are right that they might be misleading (they haven't changed much since 0.19), I'll fix that shortly.