如何设计一个Android端高性能日志监控系统

news2024/9/20 22:41:58

开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们设计了一个客户端日志系统,这为我们发现和解决问题提供了很大的保障;

首先, 一个合格的日志系统需要满足的条件:

  • 触发上传日志的可靠性和便利性, 保证触发后可在最短时间内保证上传成功,并下载到日志文件;
  • 客户端本地高性能记录日志,不可影响app正常运行;
  • 日志支持大量数据, 满足10M文本数据记录和查看;
  • 注重用户隐私,日志专门解压解密才可查看; 不收集用户个人隐私相关,只用于排查应用问题;

1. 后端拉取方案:

步骤描述:

1. 当需要上传某人的日志时,后端触发, 将用户的状态标记为需上传状态;

2. 当用户在线或再次上线时, 通过查询接口得知自己需要上传, 则执行本地上传操作;若接口未返回true,则无需任何操作;

3. 上传成功后, 后端将该用户标记为无需上传状态, 用户下次查询时无需任何操作;

上述方案可保证触发后用户可在最短时间内上传, 测试客户端轮训的间隔为3min

2. 客户端本地日志记录方案:

目前开源的方案有:

  • 腾讯mars XLog组件 https://github.com/Tencent/mars
  • 美团Logan https://github.com/Meituan-Dianping/Logan

XLog 只实现日志写入操作,后续上传,解密需自己定制;

Logan 包含客户端与服务端,写入,上传,解密等一套服务, 解密查看不支持客户端查看,只能自己部署Logan后台查看;

为保证灵活性,暂时两个都进行接入,并用一套接口封装; Logan需搭建前后端,并不支持自己解析日志,为先验证可行性,目前只使用XLog;

XLog优点:

  • mars 的日志模块 xlog 可以做到:高性能高压缩率、不丢失任何一行日志、避免系统卡顿和 CPU 波峰。

官方benchmark测试: https://github.com/Tencent/mars/wiki/Xlog-Benchmark

本地测试无间隔无限循环写入情况下, 测试内存表现,未有明显异常;

Xlog接入:

也可以直接参考下文章: 开源系列 | 基于微信XLog的日志框架&&对于XLog的分析 - 掘金

引入依赖

dependencies {
    compile 'com.tencent.mars:mars-xlog:1.2.5'
}

初始化:

System.loadLibrary("c++_shared");
System.loadLibrary("marsxlog");

final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
final String logPath = SDCARD + "/marssample/log";

// this is necessary, or may crash for SIGBUS
final String cachePath = this.getFilesDir() + "/xlog"

//init xlog
Xlog xlog = new Xlog();
Log.setLogImp(xlog);

if (BuildConfig.DEBUG) {
    Log.setConsoleLogOpen(true);
  	Log.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, "", logPath, logFileName, 0);
} else {
    Log.setConsoleLogOpen(false);
  	Log.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, "", logPath, logFileName, 0);
}

退出程序时关闭:

Log.appenderClose();​​​​​​​ 

1. 需要注意的是, 默认使用的异步写入文件, 需要上传的时候需要同步一下内存到文件中; 调用appenderFlush(true), 不然最近记录的日志可能未同步到文件中;

2. 一些其他配置, 比如log写入目录,缓存目录等, 参考https://github.com/Tencent/mars/wiki/Mars-Android-%E6%8E%A5%E5%8F%A3%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E

3. 日志文件的获取和查看

通过上面步骤, 我们成功拉取到xlog日志zip包, 但是普通的文本查看器无法查看,需要特殊的查看方法;

xlog文件查看步骤一般要经过

1. 解压zip,得到多个xlog

2. 解压并解密(如果加密了的话)xlog,得到xlog.log

3. 文本查看器查看

3.1 xlog的解密工具

官方提供了解密工具

https://github.com/Tencent/mars/wiki/Xlog-%E5%8A%A0%E5%AF%86%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95

https://github.com/yann2192/pyelliptic/tree/1.5.7

我自己用的是第三方一个可视化工具, 可以参考这篇文章

我用Flutter Deskstop做了一个Mars Xlog日志解析工具 - 掘金

工具的下载地址在这里https://github.com/JerryFans/mars_xlog_decoder_gui

3.2 大日志文件查看

得到xlog.log文件后, 往往日志文件非常大; 例如 10MB的xlog解码后的xlog.log文件高达99.8MB, 纯文本文件使用subline或电脑自带软件打开卡顿非常明显, 无法滚动;

这里推荐几个大日志文本查看工具:

大log文件查看器:

https://gitee.com/compilelife/loginsight/releases/tag/v1.0

好用的工具

https://github.com/variar/klogg/releases

我自己使用的klogg这个工具,使用起来很流畅, 搜索过滤功能也很方便,可以把搜索到的关键字记录聚集到一起, 并和原始记录分屏查看;

至此, 客户端日志拉取, 上传, 查看已形成闭环, 后面根据业务上传需要的日志就可以了,请大家多提意见;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.类型推论,类型断言,类型兼容性

目录 1 类型推论 2 类型断言 2.1 类型推论所带来的问题 2.2 基本使用 2.3 不断言会出现的问题 2.4 断言的另一种写法 2.5 查看DOM元素的类型 3 类型兼容性 3.1 类兼容性 3.2 接口兼容性 3.2.1 接口之间的兼容性 3.2.2 接口与类之间的兼容性 3.3 函数…

C++ 类的静态成员

在结构化程序设计中程序模块的基本单位是函数,因此模块间对内存中数据的共享是通过函数与和函数之间的数据共享来实现的,其中包括两个途径——参数传递和全局变量。 面向对象的程序设计方法兼顾数据的共享和保护,将数据与操作数据的函数封装…

解决运行flutter doctor --android-licenses时报错

问题描述: 配置flutter环境时,会使用flutter doctor命令来检查运行flutter的相关依赖是否配好。能看到还差 Android license status unknown.未解决。 C:\Users\ipkiss.wu>flutter doctor Flutter assets will be downloaded from https://storage.…

【MySQL】数据库的增删查改+备份与恢复

文章目录 一、创建数据库create二、数据库所使用的编码2.1 查询字符集和校验集2.2 指定编码创建数据库2.3 不同的校验集对比 三、删除数据库drop四、查看数据库show五、修改数据库alter六、数据库的备份与恢复6.1 备份 mysqldump6.2 恢复source6.3 仅备份几张表或备份多个数据库…

互联网宠物医院开发:宠物健康护航的新选择

随着人们对宠物的关注度逐渐提高,宠物医疗服务也得到了更多的关注和需求。而互联网宠物医院作为一种新兴的医疗服务形式,正以其独特的优势和便捷性受到越来越多宠物主人的青睐。   首先,互联网宠物医院的最大优势在于提供了便捷的服务。宠物…

寻找峰值——力扣162

文章目录 题目描述法一 寻找最大值法二 二分法 题目描述 法一 寻找最大值 int findPeakElement(vector<int>& nums){return max_element(nums.begin(), nums.end()) - nums.begin();}法二 二分法 int findPeakElement(vector<int>& nums) {int l 0, r n…

onnx模型的保存与使用

1 onnx模型的保存 在网络训练结束之后&#xff0c;通常会将模型的权重参数保存到.pth或.pt文件中&#xff0c;如果部署环境中有pytorch&#xff0c;那么直接新建一个模型类对象&#xff0c;然后导入权重参数即可&#xff0c;但如果部署环境中只有OpenCV&#xff0c;没有pytorc…

融合大数据、物联网和人工智能的智慧校园云平台源码 智慧学校源码

电子班牌系统用以展示各个班级的考勤信息、授课信息、精品课程、德育宣传、班级荣誉、校园电视台、考场信息、校园通知、班级风采&#xff0c;是智慧校园和智慧教室的对外呈现窗口&#xff0c;也是学校校园文化宣传和各种信息展示的重要载体。将大数据、物联网和人工智能等新兴…

27岁到来之际,我在阿里实现了年薪30W+的小目标

毕业快 5 年了&#xff0c;每当和人聊起自己的职场飞升之路&#xff0c;都不由得感激当初果断逃离舒适圈的自己。出身一所非 211、985 院校&#xff0c;毕业后入职了一家小型互联网公司&#xff0c;当着普普通通的初级测试工程师&#xff0c;工作期间虽然也时常遇到挑战&#x…

性能优化点

Arts and Sciences - Computer Science | myUSF 索引3层&#xff08;高度为3&#xff09;一般对于数据库地址千万级别的表 大于2000万的数据进行分库分表存储 JVM整体结构及内存模型 JVM调优&#xff1a;主要为减少FULL GC的执行次数或者减少FULL GC执行时间 Spring Boot程序…

在线文档管理工具都有什么值得推荐的?

在线文档管理工具是现代企业和个人必备的工具之一&#xff0c;它们可以帮助用户方便地创建、编辑、共享和管理文档。 几个值得推荐的在线文档管理工具&#xff1a; Google 文档&#xff1a;Google 文档是一款免费的在线文档工具&#xff0c;它提供了和 Microsoft Word 类似的…

微信公众号开发学习

申请测试号 地址 通过F12抓取体验接口权限表的HTML 解析HTML 引入pom <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><…

物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录 可变参数的使用技巧第三阶段-初级实验Lesson5:不一样的点灯实验---学习I/O的输出 ☆点灯的电路图分析1 一起看看点灯的电路图Tip1:另一种点灯的电路Tip1:如何访问外设的寄存器2 STM32F407中操作GPIO的方法 通过直接操作寄存器实现点灯实验Tip1:硬件编程的基本流程 2代…

数据可视化(4)散点图及面积图

1.简单散点图 #散点图 #scatter(x,y) x数据&#xff0c;y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…

VS开发Qt程序,无法打印QDebug调试信息,VS进行Qt开发时Qt Designer无法使用“转到槽”选项

VS开发Qt程序&#xff0c;无法打印QDebug调试信息&#xff0c;VS进行Qt开发时Qt Designer无法使用“转到槽”选项 VS开发Qt程序&#xff0c;无法打印QDebug调试信息VS进行Qt开发时Qt Designer无法使用“转到槽”选项 VS开发Qt程序&#xff0c;无法打印QDebug调试信息 解决方案…

使用Idea提交项目到远程仓库

使用Idea提交项目到远程仓库 1.在Idea中打开本地要推送的项目2.创建远程仓库并提交 1.在Idea中打开本地要推送的项目 tips: 首先你得有git工具&#xff0c;没有的话可以参考下面的这篇文章 git与gitee结合使用&#xff0c;提交代码&#xff0c;文件到远程仓库 从导航栏中选择 V…

如何快速开拓海外华人市场?附解决方案!

开拓华人市场对于企业来说是非常必要的。华人市场庞大且潜力巨大&#xff0c;拥有巨额的消费能力。随着华人经济的不断增长&#xff0c;越来越多的企业开始意识到华人市场的重要性。 通过开拓华人市场&#xff0c;企业可以获得更多的销售机会&#xff0c;并且在竞争激烈的市场…

Go语言time库,时间和日期相关的操作方法

time库 用于处理时间、日期和时区的核心库。在实际开发中&#xff0c;常常需要与时间打交道&#xff0c;例如记录日志、处理时间差、计算时间间隔等等。因此&#xff0c;掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中&#xff0c;时间表示为time.Time类型&…

嵌入式开发的学习内容和技能包括:

. 熟悉C语言编程 掌握基础电子知识&#xff0c;如数字电路、模拟电路和单片机 .熟练掌握嵌入式操作系统的原理、内核架构和应用&#xff0c;如Linux、RTOS等 了解各种外设接口及其驱动程序开发&#xff0c;如SPI、I2C、USART等 熟悉常用的嵌入式开发工具和软件工程流程&#…

【ASPICE】:学习记录

学习记录 ASPICE中文资料什么是ASPICE过程参考模型 ASPICE全称“Automotive Software Process Improvement and Capability dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架 ASPICE中文资料 主要资料来源 什么是ASPICE 过程参考模型