Ktor Client如何配置不打印日志中REQUEST/FROM行的请求URL
问题说明
现有代码
客户端初始化代码
var myClient: HttpClient = HttpClient(Android) { // 日志配置 install(Logging) { logger = Logger.ANDROID level = LogLevel.BODY } }
请求发起代码
myClient.get("https://www.sample.com/state")
日志输出情况
运行后打印的请求日志:
2022-07-05 11:20:58.667 977-1021/? W/System.err: [DefaultDispatcher-worker-1] INFO io.ktor.client.HttpClient - REQUEST: https://www.sample.com/state 2022-07-05 11:20:58.667 977-1021/? W/System.err: METHOD: HttpMethod(value=GET) 2022-07-05 11:20:58.667 977-1021/? W/System.err: BODY Content-Type: null 2022-07-05 11:20:58.667 977-1021/? W/System.err: BODY START 2022-07-05 11:20:58.667 977-1021/? W/System.err: 2022-07-05 11:20:58.667 977-1021/? W/System.err: BODY END
响应日志:
2022-07-05 11:20:58.924 977-2181/? W/System.err: [DefaultDispatcher-worker-2] INFO io.ktor.client.HttpClient - RESPONSE: 200 OK 2022-07-05 11:20:58.924 977-2181/? W/System.err: METHOD: HttpMethod(value=GET) 2022-07-05 11:20:58.924 977-2181/? W/System.err: FROM: https://www.sample.com/state 2022-07-05 11:20:58.924 977-2181/? W/System.err: BODY Content-Type: application/json; charset=utf-8 2022-07-05 11:20:58.924 977-2181/? W/System.err: BODY START 2022-07-05 11:20:58.924 977-2181/? W/System.err: "idle" 2022-07-05 11:20:58.924 977-2181/? W/System.err: BODY END
日志中请求URLhttps://www.sample.com/state分别在请求首行、响应的FROM字段各出现一次,出于安全要求需要隐藏日志中的URL内容。
当前依赖版本
def kotlin_version = '1.6.21' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" def kotlinx_coroutines_version = '1.6.1' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_coroutines_version" def ktor_version = '2.0.2' implementation "io.ktor:ktor-client-core:$ktor_version" // 网络请求引擎 implementation "io.ktor:ktor-client-android:$ktor_version" // 日志功能 implementation "io.ktor:ktor-client-logging:$ktor_version"
实现方案
当前使用的Ktor 2.0.2版本自带Logging插件没有提供内置的URL脱敏开关,直接自定义Logger实现替换默认日志打印逻辑即可,不需要修改业务请求代码,也不会影响实际网络请求逻辑。
操作步骤:
- 编写自定义脱敏Logger,在日志输出前过滤掉URL内容,可根据需求选择过滤方式:
import android.util.Log import io.ktor.client.plugins.logging.Logger object KtorSafeLogger : Logger { override fun log(message: String) { // 两种过滤规则二选一即可 // 1. 正则全局替换所有出现的URL,适配所有日志级别 val safeMessage = message.replace(Regex("""https?://\S+"""), "[HIDDEN_URL]") // 2. 精准匹配固定日志行,性能更高,适配当前BODY日志级别 // val safeMessage = when { // message.startsWith("REQUEST: ") -> "REQUEST: [HIDDEN_URL]" // message.startsWith("FROM: ") -> "FROM: [HIDDEN_URL]" // else -> message // } Log.d("KtorClient", safeMessage) } }
- 修改HttpClient初始化配置,将Logging插件的logger替换为自定义的安全Logger:
var myClient: HttpClient = HttpClient(Android) { install(Logging) { // 替换原有的Logger.ANDROID logger = KtorSafeLogger level = LogLevel.BODY } }
如果使用LogLevel.HEADERS或LogLevel.ALL级别,可能会在重定向Location头、Referer头等位置出现URL,只需要在自定义Logger的log方法中补充对应替换规则即可。
内容的提问来源于stack exchange,提问作者youDaily
相关产品推荐
相关产品推荐

