一、概念
| 日志级别 | 对应方法 | 场景 | 建议 | |
| verbose | Log.v() | 高频调试信息:循环内部状态、事件追踪。 |
开 发 开 启 | |
| debug | Log.d() | 调试关键路径:函数参数、数据转换结果。 | ||
| info | Log.i() | 系统核心事件:如应用启动、用户关键操作。 |
生 产 保 留 | 控制频率,避免高频场景(如循环内)记录。 |
| warn | Log.w() | 潜在风险:非预期参数但可恢复、资源接近阈值。 | 建议绑定监控告警(如磁盘空间不足触发通知)。 | |
| error | Log.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)
}
}
256

被折叠的 条评论
为什么被折叠?



