Android 优化 - 日志 Log

一、概念

日志级别对应方法场景建议
verboseLog.v()高频调试信息:循环内部状态、事件追踪。

debugLog.d()调试关键路径:函数参数、数据转换结果。
infoLog.i()系统核心事件:如应用启动、用户关键操作。

控制频率,避免高频场景(如循环内)记录。
warnLog.w()潜在风险:非预期参数但可恢复、资源接近阈值。建议绑定监控告警(如磁盘空间不足触发通知)。
errorLog.e()可恢复错误:网络超时、文件读取失败。记录完整上下文(错误码、参数、堆栈),绑定自动告警。

二、优化

2.1 动态开关

根据模块化、业务条件、远程等环境,动态的配置全局开关控制日志输出,避免影响APP性能。

object LogUtils {
    var enable = false
}

class MyApplication : Application() {
    override fun onCreate() {
        LogUtils.enable = ...
    }
}

2.2 关闭日志,参数依然会进行计算

2.2.1 问题说明

下方代码,当日志开关设置为 false 时,对 message 的传参虽然会被丢弃,但还是会先执行得出该参数的代码。

object LogUtils {
    var enabled = false
    fun d(tag: String, message: String) {
        if (enabled) {
            Log.d(tag, message)
        }
    }
}

LogUtils.d("tag", "打印:${ System.currentTimeMillis() }")    //会创建StringBuilder,获取时间戳,拼接字符串,最后丢弃
LogUtils.d("tag", "打印:$dataClass"}    //会执行数据类的toString()

2.2.2 解决办法

使用 Lambda 延迟到真正使用的时候执行,使用 inline 避免 Lambda 对象生成。

inline fun d(tag: String, message: () -> String) {
    if (enable) {
        Log.d(tag, message())
    }
}

三、封装工具类

object LogUtils {

    var enable = false

    inline fun v(tag: String, message: () -> String) {
        if (enable) {
            Log.v(tag, message())
        }
    }

    inline fun d(tag: String, message: () -> String) {
        if (enable) {
            Log.d(tag, message())
        }
    }

    inline fun i(tag: String, message: () -> String) {
        if (enable) {
            Log.i(tag, message())
        }
    }
    
    inline fun w(tag: String, message: () -> String) {
        if (enable) {
            Log.w(tag, message())
        }
    }
    
    inline fun e(tag: String, message: () -> String) {
        if (enable) {
            Log.e(tag, message())
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值