在 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. 最佳实践
- 避免敏感信息:禁止在日志中输出用户密码、Token 等敏感数据。
- 控制日志量:Verbose/Debug 级别日志应在正式包中关闭。
- 统一 TAG 规范:建议按模块或类名定义 TAG(如
UserManager
、NetworkModule
)。 - 使用 Throwable:在捕获异常时,传递异常对象以记录堆栈轨迹。
- 性能优化:频繁调用的代码中避免复杂字符串拼接(可用
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 规则移除调试日志。