You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin委托重写kotlin-logging的error方法适配两种调用方式

解决kotlin-logging error方法重写问题

核心思路

kotlin-logging的Logger接口包含多个error方法重载,需同时重写接收字符串参数和**接收无参lambda(返回String)**的两个版本,且lambda版本要主动执行lambda获取日志内容,避免输出lambda对象信息。

具体实现

  1. 自定义Logger包装类,实现KLogger接口,通过委托复用原始Logger的其他方法
  2. 重写两个关键的error重载方法:

示例代码

import mu.KLogger
import mu.KotlinLogging

class CustomLogger(private val delegate: KLogger) : KLogger by delegate {
    // 处理直接传入字符串的调用
    override fun error(msg: String) {
        // 自定义日志逻辑,比如添加统一标识、格式转换等
        val customMsg = "[CUSTOM ERROR] $msg"
        delegate.error(customMsg)
    }

    // 处理lambda形式的调用,必须执行lambda获取日志内容
    override fun error(msgProvider: () -> String) {
        val originalMsg = msgProvider()
        val customMsg = "[CUSTOM ERROR] $originalMsg"
        delegate.error(customMsg)
    }
}

// 使用方式
val originalLogger = KotlinLogging.logger {}
val logger = CustomLogger(originalLogger)

// 两种调用都会触发自定义逻辑
logger.error("直接传字符串的日志")
logger.error { "lambda形式的日志" }

关键注意事项

  • 不要重写泛型版本的error(msgProvider: () -> Any?),否则会因类型匹配问题导致lambda输出对象信息,要明确指定返回String的lambda重载。
  • 利用by delegate委托原始Logger的其他方法,无需重复实现所有接口方法。
  • lambda版本中必须调用msgProvider(),否则输出的是lambda对象的toString结果(即你看到的() -> kotlin.Any? xxxx)。

效果验证

运行上述代码后,两种调用方式都会输出带自定义前缀的日志,lambda形式的调用会正确输出字符串内容,而非lambda对象信息。

内容的提问来源于stack exchange,提问作者mhulse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:21:38