Skip to content

在 Android 开发中,日志(Logging)是调试和追踪应用行为的重要工具。Android 提供了 android.util.Log 类来支持日志输出,以下是其核心用法和最佳实践:


1. 日志级别

Log 类提供不同级别的日志方法,按优先级从低到高排列:

方法级别用途
Log.v(String, String)VERBOSE最详细日志(用于跟踪流程细节)
Log.d(String, String)DEBUG调试信息(开发阶段临时使用)
Log.i(String, String)INFO关键流程信息(如用户操作记录)
Log.w(String, String)WARN警告(潜在问题,但不会崩溃)
Log.e(String, String)ERROR错误(需修复的异常或崩溃)
Log.wtf(String, String)ASSERT致命错误(“What a Terrible Failure”)

2. 基本用法

输出日志

kotlin
// Kotlin 示例
private val TAG = "MainActivity"

fun someMethod() {
    Log.d(TAG, "Button clicked: 开始加载数据")
    try {
        // 业务逻辑
    } catch (e: Exception) {
        Log.e(TAG, "数据加载失败", e) // 附加异常堆栈
    }
}

参数说明

  • TAG:日志标签,通常使用类名,用于过滤日志。
  • Message:日志内容,可拼接动态值(如 "Count: $count")。
  • Throwable(可选):附加异常信息(如 Log.e(TAG, "Error", exception))。

3. 高效管理 TAG

方案 1:类内常量

kotlin
class MainActivity : AppCompatActivity() {
    companion object {
        private const val TAG = "MainActivity"
    }
    // ...
}

方案 2:扩展属性(Kotlin)

kotlin
// 定义扩展属性
val Any.TAG: String
    get() = this::class.simpleName ?: "Unknown"

// 使用
Log.d(TAG, "Debug message")

4. 高级技巧

条件化日志输出

在正式包中关闭调试日志,避免性能和安全问题:

kotlin
// 自定义 LogUtil 工具类
object LogUtil {
    private val isDebuggable = BuildConfig.DEBUG

    fun d(tag: String, message: String) {
        if (isDebuggable) Log.d(tag, message)
    }
    // 其他级别同理...
}

// 使用
LogUtil.d(TAG, "仅在调试模式输出")

格式化日志

使用 String.format() 或 Kotlin 字符串模板提高可读性:

kotlin
Log.i(TAG, "用户登录成功: ID=${user.id}, 时间=${System.currentTimeMillis()}")

5. 在 Logcat 中过滤日志

Android Studio 的 Logcat 工具支持按以下条件过滤日志:

  • TAG:如 tag:MainActivity
  • 级别:如 level:ERROR
  • 关键字:如 package:com.example.app
  • 进程 ID:如 pid:1234

示例命令:

bash
adb logcat -s MainActivity:W *:E  # 仅显示 MainActivity 的 WARN 及以上日志和其他 ERROR

6. 最佳实践

  1. 避免敏感信息:禁止在日志中输出用户密码、Token 等敏感数据。
  2. 控制日志量:Verbose/Debug 级别日志应在正式包中关闭。
  3. 统一 TAG 规范:建议按模块或类名定义 TAG(如 UserManagerNetworkModule)。
  4. 使用 Throwable:在捕获异常时,传递异常对象以记录堆栈轨迹。
  5. 性能优化:频繁调用的代码中避免复杂字符串拼接(可用 if (BuildConfig.DEBUG) 包裹)。

7. 常见问题

Q:为什么我的日志在 Logcat 中不显示?

  • 检查设备/模拟器的日志级别是否过滤掉了当前级别(如默认 INFO 会隐藏 DEBUG)。
  • 确保应用有 INTERNET 权限(仅限某些定制 ROM 的特殊情况)。

Q:如何保存日志到文件?

kotlin
// 将日志写入文件(需权限)
fun saveLogToFile(message: String) {
    try {
        File(context.filesDir, "app.log").appendText("$message\n")
    } catch (e: IOException) {
        Log.e(TAG, "保存日志失败", e)
    }
}

总结

Log 是 Android 开发中最直接的调试工具,合理使用不同级别的日志,结合 Logcat 过滤和分析,能显著提升问题排查效率。在正式发布时,务必通过 BuildConfig.DEBUG 或 ProGuard 规则移除调试日志。