android日志搜集原理及方案比较
说明: 本文只讨论Log日志,而不是应用的埋点日志。
Android 日志架构
用一张图来了解Android Log的架构:

具体的流程可以看下面的这张图:

这里涉及到三个进程:
APP进程: 调用Log的接口打日志,最终通过soctket通信发送给Logd进程
Logd进程:有一个缓冲区用于存储日志(环形缓冲区,当满时会冲掉旧的日志)
Logcat进程:可以在adb shell中创建(可以创建多个),查看缓冲区中日志的进程(Android Studio的logcat也是一个Logcat进程)。
环形缓冲区是一个逻辑上的循环队列,写者可以往里面写东西,而一旦有内容会通知等待队列里的读者们来读取内容,否则等待队列列处于阻塞状态。 这就意味Logcat进程读取也是阻塞形式的。
基于缓存的日志方案
普通应用
该方案会在系统的Log类上封装一层,应用调用封装层的日志接口。封装层将业务记得log缓存到一个StringBuffer中,当量达到一定阈值后,再刷到文件中。到达一定条件上传到服务端。
基于缓存的日志方案 对于普通应用:实现一套自己的Log,将每次打的日志缓存
系统应用
在应用中开启一起Logcat进程,不断的读取Logd进程中的日志到缓存中,当日质量达到一定的阈值后再刷如文件。这种方案可以搜集到所有应用的日志。
缺点:
1. 写文件 + 加密 会出现cpu峰值
2.崩溃或者进程意外退出 缓存中的日志可能无法刷到文件中,关键崩溃信息可能丢失。
3. 对于智能设备中专门做一个日志进程去搜集所有应用的日志,这种方案其实是简单可行的。
基于内存映射mmp的方案
mmp 原理:
内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。
以下是一个把普遍文件映射到用户空间的内存区域的示意图。

系统层提供了具体的将用户空间地址映射到内核空间的具体接口函数,这里未作学习。
通过mmp读取磁盘文件:
如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,上图步骤4所示。这个过程也与内存映射无关。
通过系统read/write文件原理:

它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图过程1,然后再将这些数据拷贝到用户空间,如图过程2,在这个过程中,实际上完成了 两次数据拷贝 ;
而mmap()也是系统调用,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高。
mmp作为日志方案优势
1.读写文件比普通文件操作效率更高
2.不会丢日志(进程退出时能刷日志到映射的地址中) 会写日志的时机: 内存不足 进程退出 调用 msync 或者 munmap 不设置 MAP_NOSYNC 情况下 30s-60s(仅限FreeBSD)
3. 对于CPU峰值问题,参考微信XLOG解决方案如下: 追加每行日志时,先压缩后加密(避免了对整个文件的压缩/加密)
思考:
大多数用户的日志时无用的,日志上传场景考虑,通过指令捞取
具体日志策略需要综合多方面考虑: 流畅性/完整性/容错性/安全性
MMP的具体使用还要结合具体场景,需要测试追加日志大小
参考:
https://blog.csdn.net/tencent_bugly/article/details/53157830
http://ju.outofmemory.cn/entry/224106
https://blog.csdn.net/coolwriter/article/details/80493166
https://blog.csdn.net/shift_wwx/article/details/89138117
log系统源码下载地址:https://android.googlesource.com/platform/system/core/+/refs/tags/android-8.0.0_r37
android日志搜集原理及方案比较的更多相关文章
- 解析 Android Things 技术原理
2012 年 6 月,由 IoT-GSI(Global Standards Initiative on Internet of Things)发布的白皮书“ITU-T Y.4000/Y.2060”[1 ...
- android MultiDex multidex原理原理下遇见的N个深坑(二)
android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...
- Android消息推送完美方案[转]
转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...
- android MultiDex multiDex原理(一)
android MultiDex 原理(一) Android分包MultiDex原理详解 转载请注明:http://blog.csdn.net/djy1992/article/details/5116 ...
- nginx 日志搜集解决方案
# nginx 日志搜集解决方案 ## 系统环境描述 ``` java8 logstash --监控nginx日志文件 ``` ## 技术描述 ``` 通过logstash监控nginx access ...
- K8S学习笔记之K8S日志搜集实战
详细参考这篇文章,几乎覆盖了了K8S的各种日志搜集方案 https://juejin.im/post/5b6eaef96fb9a04fa25a0d37#heading-8
- Android日志猫的使用
Android日志猫的使用 Android给我们提供了一个Log类,这个类有一些方法,比如 我们可以在我们的代码中添加这些方法进行测试 package com.example.test; import ...
- Android数据库加密之sqlciher方案
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6241964.html 前言 大家好,我是Cavalier ...
- Atitti.java android反编译解决方案-----虚拟机方案
Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...
随机推荐
- React 如何搭建脚手架
React 如何搭建脚手架 npm install -g create-react-app //安装 create-react-app react-demo // react-demo ...
- DataPipeline丨DataOps理念与设计原则
作者:DataPipeline CEO 陈诚 上周我们探讨了数据的「资产负债表」与「现状」,期间抛给大家一个问题:如果我们制作一个企业的“数据资产负债表”,到底会有多少数据是企业真正的资产? 数据出现 ...
- cogs 1254. 最难的任务 Dijkstra + 重边处理
1254. 最难的任务 ★ 输入文件:hardest.in 输出文件:hardest.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 这个真的很难.算出 123 ...
- 如何实现css渐变圆角边框
最近设计师的风格发生突变,一句话概括就是,能用渐变的地方绝对不用纯色.这不,就整出了一个渐变圆角边框.这渐变好做,圆角好做,渐变圆角也没问题,可是在加个边框还是有点坑的.没办法,看看怎么实现吧 bor ...
- String关键字
关于String和new String()见我写的前一篇博客 String和new String()的区别 1.String的"+"运算 a.String str = " ...
- OCP培训 Oracle 12c/18c/19c OCP认证实战培训【送OCP优惠名额】
一.OCP培训 Oracle 12c/18c/19c OCP认证全套实战培训[送OCP优惠名额],本课程内容 课程目标: 为满足想参加Oracle OCP考证的学员,风哥设计的一套比较全面OCP实战培 ...
- Seq[找规律]----2019 年百度之星·程序设计大赛 - 初赛一:1005
Seq Accepts: 1249 Submissions: 3956 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- 并发编程 Semaphore的使用和详解
类Semaphore的基本使用 Semaphore的作用:限制线程并发的数量 课外话题[多线程的同步概念]:其实就是排着队去执行一个任务,执行任务是一个一个的执行,这样的优点是有助于程序逻辑的正确性, ...
- Streaming-大数据的未来
分享一篇关于实时流式计算的经典文章,这篇文章名为Streaming 101: The world beyond batch 那么流计算如何超越批处理呢? 从这几个方面说明:实时流计算系统,数据处理模式 ...
- 浏览器DOM渲染及阻塞问题
在准备面试,然后复习到了计网的知识点,紧接着又扯到了url从输入到浏览器渲染的那个问题,这里来顺便完善补充一下,本文的重点在渲染 上面的图就是浏览器从服务器请求来页面后渲染的全过程 这里我们分开来看: ...