热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

日志系统_客户端log日志系统

篇首语:本文由编程笔记#小编为大家整理,主要介绍了客户端log日志系统相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了客户端log日志系统相关的知识,希望对你有一定的参考价值。


客户端log日志系统




背景

我们在开发过程中出现了个别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

https://github.com/luojilab/DataReporter


原理

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

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


客户端log日志系统

原理图

如图: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

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


****欢迎一块交流学习~****

喜欢的朋友记得点赞转发分享哦!



推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
author-avatar
Dear丶尐英
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有