Android 缓存日志(Logcat)导出与分析全攻略
为什么要导出缓存日志?
当遇到隐形的症状(崩溃、异常)时,方便事后排查
网络掉线或 USB 断开时依然可用
设备端缓存日志可用于异常回溯分析
按需过滤导出
1. 按进程(PID)过滤
bash
复制代码
adb logcat -d --pid=
缓冲区类型
命令示例
用途
崩溃日志
adb logcat -b crash > crash.log
未捕获异常
系统事件
adb logcat -b events > events.log
系统 UI 事件
Radio
adb logcat -b radio > radio.log
网络/通信问题
按日志级别过滤
bash
复制代码
adb logcat -d -v threadtime *:E > errors.log
日志级别说明:
Verbose:全部日志
Debug:调试信息
Info:普通信息
Warning:警告
Error:错误
Fatal:致命错误
按关键字过滤
bash
复制代码
adb logcat -d -v threadtime | grep "NullPointer" > crash.log
验证导出结果
bash
复制代码
# 查看日志总行数
wc -l log_2025-08-08.log
# 查看前20行
head -n 20 log_2025-08-08.log
自动化示例
1. 一键导出当前前台应用日志
bash
复制代码
pkg=$(adb shell dumpsys window | grep mCurrentFocus | awk -F'/' '{print $1}' | awk '{print $NF}')
adb logcat -d -v threadtime --pid=$(adb shell pidof $pkg) > ${pkg}_$(date +%F_%H-%M-%S).log
2. 崩溃日志自动抓取器
bash
复制代码
while true; do
if adb logcat -d -b crash | grep -q "FATAL EXCEPTION"; then
ts=$(date +%F_%H-%M-%S)
adb logcat -d -v long -b crash > crash_${ts}.log
echo "崩溃日志已保存:crash_${ts}.log"
break
fi
sleep 5
done
常见问题与优化技巧
问题
解决方案
Insufficient permissions
授予日志访问权限或获取 root
缓存覆盖
提前导出,增大缓存区大小
断连
保存到 /sdcard 后再拉取
乱码解决
bash
复制代码
adb logcat -d | iconv -f utf-8 -t utf-8//IGNORE > clean.log
最佳实践
测试阶段全程后台记录:
bash
复制代码
adb logcat -v threadtime -f /sdcard/full.log &
发现问题立即 dump 缓存
结合 bugreport 获取更全面的诊断信息