Kotlin委托重写kotlin-logging的error方法适配两种调用方式
解决kotlin-logging error方法重写问题
核心思路
kotlin-logging的Logger接口包含多个error方法重载,需同时重写接收字符串参数和**接收无参lambda(返回String)**的两个版本,且lambda版本要主动执行lambda获取日志内容,避免输出lambda对象信息。
具体实现
- 自定义Logger包装类,实现
KLogger接口,通过委托复用原始Logger的其他方法 - 重写两个关键的
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
相关产品推荐
相关产品推荐

