背景

我们在开发过程中出现了个别bug,而我们往往很难定位到问题所在,这个不仅仅局限于移动端,只是移动端不容易定位问题。我们常见的实现方式可能是,

1. 创建一个带队列的线程。

2. 把要上报的数据抛入线程队列中。

3. 数据过多本地写入文件。

4. 线程异步开始上报。

5. 上报完成后删除本地文件。

但这个实现方案经常会有一些问题:

1. 上层写入数据过快,写文件线程来不及写入文件,此时应用发生crash或app被杀,导致上报数据丢失。

2. 多业务场景很难复用。

3. 文件序列化经常出现问题,导致数据丢失。

4. 不跨平台,安卓和iOS通常出现不同的实现,总是各自出现不同的问题,不容易定位,统一解决。

因为我们对数据要求很高,完全不允许数据出现丢失。所以针对上面这种方案的实现是不允许的。所以我们想针对这种不允许数据丢失的需求,开发一套准实时数据上报组件,感兴趣的同学可以一块研究研究。

我们希望有以下功能:

1. 数据不丢失,app发生crash或者异常被杀,数据不丢失,下次启动会再次被上报

2. 数据上报有序性,上报数据会保证与push进来的数据顺序是一致的,不会造成数据乱序

3. 上报效率高,可配置单次上报数量,当缓存数据过多时,可进行一次上报多条数据,减少链接次数

4. 多业务服用,多业务可创建不同实例,进行上报,互不影响

5. 跨平台,c++实现,Android/iOS共用一套代码,逻辑完全统一, 不会存在出现不同异常现象

5. 效率高,底层采用c++实现,同时采用单线程模型进程上报,多业务共用一个线程,有效节省开销。当上报数据为空时线程进入休眠。

6. 异常兼容好,在最恶劣的情况,手机系统突然挂掉或异常关机,(正常关机不受影响)。若此时正在写入数据,可能导致数据的不完整性,对常规的序列化方式,整个数据会导致不可用。

这里推荐2款个人比较看好的log日志系统:

DataReporter

git地址:

https://github.com/luojilab/DataReporter

原理

为了保证数据在app未被卸载和手机异常关机的情况下,能够100%不丢失。这套方案我们参考了目前比较流行的。mmap。因为mmap可以创建一块内存,把内存映射到文件。这块内存的管理由操作系统来维护。只要操作系统不出现异常挂掉。该内存的数据是不会丢失的。即使当前的App已经被杀死后者发生crash。下次app启动,用之前的文件映射去调用系统接口,还是能换出之前crash之前的内存数据。这样就保证了数据在app crash或者异常被杀掉的情况下,数据不丢失。因为最早mmap是用来进程间传递数据使用,所以具有这种进程挂掉数据不丢失的特点。

目前采用mmap作为数据缓冲的项目已经呈雨后春笋般。像腾讯的xlog和MMKV都采用了mmap技术。

原理图

如图:DataReporter大致原理如图所示, 业务调用主要接口只有一个push。上层调用push接口,把数据push到PushBuffer中,然后唤起上报方法Report。Report方法,copy PushBuffer中数据到UploadBuffer,这样做是为了保证上报数据和push数据独立,同时不block数据的push。上层可以畅通的调用push。UploadBuffer中的数据通过,上层实现的Upload接口进行上报。上报成功后通过UploadSuccess接口通知底层组件。底层根据上传成功后条数,开始上报下一批数据。当某批次数据上报失败。通过UploadFiald接口通知,底层组件,底层开始进行delay之后再次上报。因为如果一直进行错误尝试,会导致上报尝试过频繁。导致服务器压力过大。所以上报失败一次,进行了5秒的delay。再次失败,时间累计。如果上层想马上再次尝试,可以使用reaWaken接口,立马开始错误重报。

当PushBuffer数据过多。开始触发写文件操作。写文件方法WriToFile方法,开始把PushBuffer数据拷贝到WriteBuffer,并开始写入磁盘。当上报方法Reporter发现磁盘有文件时,先进行文件的上报,再进行PushBuffer内存的上报。保证上报的顺序性。

这里还是要提一下腾讯的xlog,这个代码在进行数据写文件时,没有使用mmap作为buffer,而是直接使用的普通内存。所以在拷贝文件过程中,如果出现crash。拷贝buffer中的数据就会丢失,所以还是存在很大风险的。希望后面他们能改进。

数据组织方式:

本地数据的序列化DataReporter采用了强纠错的结构。

数据结构

如图:每条数据都保存数据crc。当某条数据写入一半时,发生crash,单条数据损坏。这时不应该整个数据丢弃,而只应该丢弃单条,这种如果用平台实现,就很难实现这么细的粒度。但是我们用c++独立设计数据存储结构。实现单条数据损坏,只丢弃单条数据。整体数据稳定性要稳健很多。

注意:

在调用Release之后,其他方法都不能再被调用。一个好的处理方式,是方法的调用都放在ui线程。不用担心会导致ui线程耗时。底层没有任何耗时或者io的操作,io都是异步的io。不会有任何block操作。

多业务多接口:

对于多业务 多接口可以创建不同的实例。只要不同实例配置的缓存路径不同即可。不同业务的上报互不影响。但是共用一个线程。所以不用担心性能损耗,已经控制的非常细致了。

Logan

git地址:

https://github.com/Meituan-Dianping/Logan

原理:

Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务。同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利。

Logan已经稳定迭代了一年多的时间。目前美团点评绝大多数App已经接入并使用Logan进行日志收集、上传、分析。近日,我们决定开源Logan生态体系中的存储SDK部分(Android/iOS),个人感觉比者成熟很多,各位可以参考参考。

这里就不做详细介绍了。

文档地址:

https://tech.meituan.com/logan_open_source.html

客户端log日志系统相关推荐

  1. FFmpeg源码分析:log日志系统

    FFmpeg的封装专有的log日志系统,支持设置日志等级log level,也支持日志回调log callback,方便开发者调试与排查问题. 1.日志等级 log日志位于libavutil模块,lo ...

  2. DPDK 18 log日志系统使用

    概述: DPDK 日志系统分为1-8个等级,在lib/librte_eal/common/include/rte_log.h文件中定义,每个DPDK模块都可以定义一个预设日志输出等级,只有日志输出语句 ...

  3. C++ 实现简易 log 日志系统

    1.log日志的作用 在软件开发周期中,不管是前台还是后台,系统一般会采用一个持久化的日志系统来记录运行情况. 在代码中嵌入log代码信息,主要记录下列信息: (1)记录系统运行异常信息. (2)记录 ...

  4. LVGL misc log日志系统(lv_log.h)

    更多源码分析请访问:LVGL 源码分析大全 LVGL misc log日志系统目录 1.概述 2.API 2.1.日志级别 2.2.日志输出宏 3.使用方法 1.概述 LVGL的日志系统实现比较简单, ...

  5. C++实现log日志系统

    1.log日志的作用 在软件开发周期中,不管是前台还是后台,系统一般会采用一个持久化的日志系统来记录运行情况. 在代码中嵌入log代码信息,主要记录下列信息: (1)记录系统运行异常信息. (2)记录 ...

  6. Android Log日志系统

    目录 0. 前言 1. Native的Log写过程解析 2. Socket的另一端Logd 0. 前言 Android中 logd 详解_私房菜的博客-CSDN博客_logd 里面讲了Java层Log ...

  7. 基于C/C++的log日志记录等级系统

    目录 log日志系统初始化 log日志输出 禁止log日志输出 log日志关闭 log日志测试 log日志系统初始化 int logger_init(int loglevel) {time_t now ...

  8. webserver之日志系统

    前言 此博客记录对于TinyWebServer项目的学习,并根据自己的理解做出些许更改. 原项目地址:https://github.com/qinguoyi/TinyWebServer Log 日志系 ...

  9. golang日志服务器_日志系统 | log/syslog (log) – Go 中文开发手册 - Break易站

    Go 中文开发手册 日志系统 | log/syslog (log) - Go 中文开发手册 import "log/syslog"概述索引示例 概述 软件包系统日志为系统日志服务提 ...

最新文章

  1. C/S端开发问题汇总
  2. Java合并pdf文件
  3. mysql触发器可以使用正则表达式_SQL 正则表达式及mybatis中使用正则表达式
  4. Docker学习总结(9)——Docker常用命令
  5. scheduled只执行一次,有个定时任务突然不执行了?
  6. 数据分析只能当一辈子取数机?可能你缺少这个基础思维
  7. 集团公司(嵌入ETL工具)财务报表系统解决方案
  8. Message:Unable to locate element 问题解决方法
  9. 802.x无线认证服务器,无线802.1X认证
  10. 前端规范——前后端接口规范
  11. 常见的软件测试方法有,常见的几种软件测试方法都有哪些
  12. ISO 9001质量管理体系标准概述
  13. 计算机辅助教学应用于哪些方面,计算机辅助教学在英语教学中的运用
  14. 埃尔米特插值c语言编程,131张艳-埃尔米特(Hermite)插值逼近的C语言程序.doc
  15. 寻找AR中的Big Difference - v2.0 | MixLab AR指南
  16. HTML绘制齿轮,HTML5模拟齿轮动画代码实例
  17. C++ 小帅真的饿了
  18. 从零开始的Nginx详解(3)【Nginx-Https服务配置详解】
  19. 智能驾驶是什么意思_智能驾驶当道,谁还在谈驾驶乐趣?
  20. Git: checkout的用法总结(1)

热门文章

  1. C#实现的QQ登录器
  2. 使用c语言测试大端和小端,C语言*符号使用及大端法小端法测试
  3. 今天下午去京东物流应聘快递员
  4. 计算机应用自荐书中专1000,中专生的自荐书
  5. 用 Python 监控知乎和微博的热门话题!
  6. mybatis什么时候用的${}
  7. MATLAB——Simulink如何将模块进行封装
  8. DHT11温湿度传感器编程详解
  9. Qt使用qsqlite数据库开发时,没有问题,但是发布后出现打不开、报错现象
  10. Android毕业设计及论文答辩经验分享