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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:39:40