Android 优化 - 日志 Log

一、概念

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

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

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

二、封装为 LogUtils

2.1 动态开关

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

object LogUtils {
    var enable = false
}

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

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

下方代码,当日志开关设置为 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()

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

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

2.3 最终代码

object LogUtils {

    var enable = true
    private const val DEFAULT_TAG = "***MyApp***"   //默认Tag
    val ktNameTag = Throwable().stackTrace.first().fileName ?: DEFAULT_TAG    //kt文件名Tag

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

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

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

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

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

}

三、封装为 StringExt

全局常量开关。

object Constants {
    var ENABLE_LOG = true
}

这里 tag 默认是 kt文件名。

fun String.logV(teg: String = Throwable().stackTrace.first().fileName) {
    if (BuildConfig.DEBUG) {
        Log.v(teg, this)
    }
}

fun String.logI(teg: String = Throwable().stackTrace.first().fileName) {
    if (BuildConfig.DEBUG) {
        Log.i(teg, this)
    }
}

fun String.logW(teg: String = Throwable().stackTrace.first().fileName) {
    if (BuildConfig.DEBUG) {
        Log.w(teg, this)
    }
}

fun String.logD(teg: String = Throwable().stackTrace.first().fileName) {
    if (BuildConfig.DEBUG) {
        Log.d(teg, this)
    }
}

fun String.logE(teg: String = Throwable().stackTrace.first().fileName) {
    if (BuildConfig.DEBUG) {
        Log.e(teg, this)
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值