如何将Ktor客户端日志配置为单行输出格式?
如何将Ktor客户端日志中的REQUEST/RESPONSE与METHOD合并为单行输出
环境与当前配置
使用ktor-client-core:2.3.2和ktor-client-logging:2.3.2插件,现有配置如下:
Ktor客户端代码
val httpClient = HttpClient(engine) { install(Logging) { level = LogLevel.INFO } }
Logback配置文件
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%25.25thread] %cyan(%-36.36logger): %msg %n</pattern> </encoder> </appender> </configuration>
当前日志输出中,REQUEST/RESPONSE信息与METHOD信息分属两行,期望实现如下单行输出:
2023-07-11 16:34:00.370 INFO --- [her-worker-1 @coroutine#1] io.ktor.client.HttpClient : REQUEST: http://localhost:1234/test METHOD: HttpMethod(value=POST) 2023-07-11 16:34:01.004 INFO --- [her-worker-3 @coroutine#1] io.ktor.client.HttpClient : RESPONSE: 200 OK METHOD: HttpMethod(value=POST)
解决方案
可以通过Ktor的AdvancedLogging插件实现该需求,这是2.x版本中更灵活的日志控制方案,具体步骤如下:
1. 确认依赖
确保项目中引入了ktor-client-logging-jvm依赖(Gradle示例):
implementation("io.ktor:ktor-client-logging-jvm:2.3.2")
2. 替换Logging插件为AdvancedLogging
修改Ktor客户端配置,使用AdvancedLogging替代默认的Logging插件,自定义请求和响应的日志格式:
val httpClient = HttpClient(engine) { install(AdvancedLogging) { logger = LoggerFactory.getLogger("io.ktor.client.HttpClient") level = LogLevel.INFO // 可选:过滤需要日志的请求,这里默认记录所有请求 filter { true } // 按需开启请求/响应内容日志,默认关闭 logRequestContent = false logResponseContent = false // 自定义请求日志内容,合并URL与方法 logRequest { request -> "REQUEST: ${request.url} METHOD: ${request.method}" } // 自定义响应日志内容,合并状态与请求方法 logResponse { response -> "RESPONSE: ${response.status} METHOD: ${response.request.method}" } } }
3. 保持Logback配置不变
上述配置生成的日志消息已经是合并后的单行内容,原Logback的格式配置无需修改,即可输出符合预期的日志。
内容的提问来源于stack exchange,提问作者Maicol
相关产品推荐
相关产品推荐

