在 Android 应用开发过程中,很多团队只关注 Crash(崩溃)收集,而忽略了普通业务日志的重要性。实际上,线上问题中超过 80% 并非直接崩溃,而是:
- 蓝牙连接失败
- 网络请求异常
- 登录状态失效
- 页面卡死
- AI接口调用失败
- Socket连接中断
- 设备兼容性问题
- 用户误操作问题
这些问题往往只能通过日志进行定位。
因此,一个成熟的 Android APP 应具备:
「日志采集 → 本地存储 → 自动归档 → 用户导出 → 开发者分析」
完整的日志治理体系。
1、 Android日志分类
Android日志大致可分为四类:
例如:
Log.d("Login", "开始登录");
Log.i("BLE", "开始扫描设备");
Log.e("Net", "请求失败");
这些都属于业务日志。
二、线上日志收集总体架构
推荐架构:
日志管理模块
│
┌────────────┼────────────┐
▼ ▼ ▼
查看日志 分享日志 上传服务器
三、方案一: Logcat实时抓取
最简单方案。
执行命令
logcat
过滤指定Tag:
logcat -s BLE
Java调用:
Process process = Runtime.getRuntime() .exec("logcat -d");
读取输出:
BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
Log.d("LOGCAT", line);
}
优点
无需额外开发
可以获取系统日志 缺点
Android 10以后限制较多,无法长期保存,容易丢失,线上产品不推荐
四、方案二:文件日志(推荐)
业内最常用方案。 例如:
Logger.d("开始连接设备");
同时:
控制台输出
- 写入文件
日志目录
推荐:
Android/data/
com.xxx.app/
files/
logs/
例如:
/storage/emulated/0/ Android/data/ com.demo.app/
files/logs/
日志文件
按天切分:
2026-06-01.log
2026-06-02.log
2026-06-03.log
日志格式
2026-06-01 10:00:01 D/Login 开始登录
五、方案三:统一Logger框架
企业项目通常不会直接使用:
Log.d()
而是封装:
AppLogger.d()
AppLogger.i()
AppLogger.e()
例如:
AppLogger.d(
"BLE",
"开始连接设备"
);
实现:
public class AppLogger {
public static void d(
String tag,
String msg) {
Log.d(tag, msg);
FileLogger.write(
"D",
tag,
msg);
}
}
六、方案四:使用开源日志库
推荐成熟方案。
Logger
项目:
[Logger 官方项目]
特点:
- 使用简单
- 格式美观
- 开发调试友好
示例:
Logger.d("登录成功");
Timber
项目:
[Timber 官方项目]
Google工程师常用。
示例:
Timber.d("登录成功");
XLog (强烈推荐)
项目:
[XLog 官方项目]
特点:
- 文件日志
- 自动归档
- 自动压缩
- 自动清理
- 线程安全
初始化:
XLog.init(LogLevel.ALL);
记录日志:
XLog.d("开始扫描设备");
保存文件:
new FilePrinter.Builder(path)
.build();
对于线上项目,这是目前非常成熟的方案。
七、日志自动归档方案
不要无限制增长。
例如:
logs/
2026-05-28.log
2026-05-29.log
2026-05-30.log
2026-05-31.log
保留:
最近7天
自动删除:
if(fileAge > 7Days){
file.delete();
}
八、日志压缩方案
用户反馈问题时:
不要发送:
20个log文件
而是:
logs.zip
压缩:
ZipOutputStream zos
生成:
logs_20260601.zip
通常大小:
5MB
↓
300KB
九、用户分享日志方案
这是线上定位问题最有效的方法。
APP设置页面
设置
├─ 用户反馈
├─ 导出日志
└─ 分享日志
点击:
导出日志
执行:
zipLogs();
生成:
logs.zip
分享代码****
Intent shareIntent =
new Intent(
Intent.ACTION_SEND);
shareIntent.setType(
"application/zip");
shareIntent.putExtra(
Intent.EXTRA_STREAM,
uri);
startActivity(
Intent.createChooser(
shareIntent,
"分享日志"));
可分享到:
-
微信
-
QQ
-
Telegram
-
Facebook
-
邮件
-
Google Drive
十、问题反馈自动携带日志****
推荐实现:
提交内容:
{
"userId":"10001",
"appVersion":"1.5.2",
"androidVersion":"14",
"device":"Pixel 5",
"logFile":"logs.zip"
}
十一、 Crash日志统一管理
捕获:
Thread.setDefaultUncaughtExceptionHandler();
实现:
public class CrashHandler
implements
Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(
Thread t,
Throwable e) {
saveCrashLog(e);
}
}
保存:
crash/
crash_20260601.txt
十二、企业级最佳实践方案
对于中大型Android项目,推荐采用以下架构: