Android APP 线上日志收集与导出技术方案实践

21 阅读3分钟

在 Android 应用开发过程中,很多团队只关注 Crash(崩溃)收集,而忽略了普通业务日志的重要性。实际上,线上问题中超过 80% 并非直接崩溃,而是:

  • 蓝牙连接失败
  • 网络请求异常
  • 登录状态失效
  • 页面卡死
  • AI接口调用失败
  • Socket连接中断
  • 设备兼容性问题
  • 用户误操作问题

这些问题往往只能通过日志进行定位。

因此,一个成熟的 Android APP 应具备:

「日志采集 → 本地存储 → 自动归档 → 用户导出 → 开发者分析」

完整的日志治理体系。

1、 Android日志分类

Android日志大致可分为四类:

image.png

例如:

Log.d("Login", "开始登录");

Log.i("BLE", "开始扫描设备");

Log.e("Net", "请求失败");

这些都属于业务日志。

二、线上日志收集总体架构

推荐架构:

image.png            

              日志管理模块

                    │

       ┌────────────┼────────────┐

       ▼            ▼            ▼

    查看日志     分享日志      上传服务器

三、方案一: 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

十、问题反馈自动携带日志****

推荐实现:

image.png

提交内容:

{

    "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项目,推荐采用以下架构:

           image.png