📝

kotlin + micronautでLogbookを使ってRequestとResponseのログを出力するメモ

2023/11/17に公開

micronaut2系はフィルターでRequestを取得してログに出せたが久しぶりに触るとそれが出来なくなっていたのでLogbookを使ってログを出力する。

下記リンクを見れば書いてある。
https://docs.micronaut.io/latest/guide/#nettyClientPipeline

build.gradle に下記を追加。

    implementation("org.zalando:logbook-core:3.5.0")
    implementation("org.zalando:logbook-netty:3.5.0")
    implementation("org.zalando:logbook-json:3.5.0")

NettyClientCustomizerにログを出力するための処理を登録。

@Singleton
class LogbookCustomizer : BeanCreatedEventListener<NettyServerCustomizer.Registry> {
    override fun onCreated(event: BeanCreatedEvent<NettyServerCustomizer.Registry>): NettyServerCustomizer.Registry {
        val registry = event.bean
        registry.register(Customizer(null))
        return registry
    }

    private inner class Customizer constructor(private val channel: Channel?) :
        NettyServerCustomizer {

        override fun specializeForChannel(channel: Channel, role: NettyServerCustomizer.ChannelRole) = Customizer(channel)

        override fun onStreamPipelineBuilt() {
            val logbook = Logbook.builder()
                .build()

            channel?.pipeline()?.addBefore(
                ChannelPipelineCustomizer.HANDLER_HTTP_STREAM,
                "logbook",
                LogbookServerHandler(logbook)
            )
        }
    }
}

logback.xmlに下記を追加

    <logger name="org.zalando.logbook">
        <level value="${LOG_LEVEL_LOGBOOK:-trace}"/>
    </logger>

Discussion