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++源码就可.. ...
随机推荐
- 夯实Java基础(八)——代码块
在Java中代码块指的是使用”{}”括起来的代码称为代码块.代码块一共分为4种:局部代码块,静态代码块,同步代码块,构造代码块. 1.局部代码块 局部代码块就是定义在方法体内部的代码块. public ...
- Log4j 2 配置
版本区别 Log4j 2 与 log4j 1.x 最大的区别在于,新版本的 log4j 2 只支持 json 与 xml,不再支持以前的 properties 资源文件 下载 log4j 的jar 包 ...
- 深扒JVM,对它进行“开膛破肚”式解析!
1. 打怪升级,你绕不开JVM JVM,对Java程序员进阶而言,是一个绝对绕不开,也不能绕开的话题. 在你打怪升级.进阶蜕变的路上,势必会遇到项目上线中各种OOM.GC等问题,此时JVM的功底就至关 ...
- mybatis学习笔记(二)
三种查询方式,由<resultType 属性控制> 第一种 selectList() 返回值为LIst List<People> selectList = session.se ...
- 关于 java中的换行符
java中实现换行有以下3种方法: 1.使用java中的转义符"\r\n": String str="aaa"; str+="\r\n"; ...
- Scala类和对象(二)
1. 类和属性 1.1 如何控制构造函数字段的可见性 在Scala中: 如果一个字段被声明为var, Scala会为该字段生成getter和setter方法. 如果字段是val, Scala只生成ge ...
- 转载 | float 清除浮动的7种方法
什么叫浮动:浮动会使当前标签脱离文档流,产生上浮的效果,同时还会影响周边元素(前后标签)及父级元素的位置和width,height属性.下面用一个小例子来看一看浮动的全过程:1.首先我们新建一个网页, ...
- js学习之数据类型
js学习之数据类型 基础类型:number string boolean null undefined 引用类型:object array function undefined值是派生自null值的( ...
- Linux系统关机与重新引导流程简介
引言 在<Linux启动之旅>中,我们了解了Linux的启动过程,下面我们一同来学习Linux关机与重新引导流程. 不同于桌面系统,作为服务器,我们较少对Linux系统进行系统重启,但在以 ...
- Laya 中缩放的实现
Laya 缩放功能的实现 在 laya 中实现滚轮对选中对象的缩放,涉及到以下两个模块: 事件 容器坐标 1. 事件 在 Laya 中, Event 是事件类型的集合.包含了常见的鼠标事件.键盘事件. ...