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++源码就可.. ...
随机推荐
- String——字符串
首先看一下string的一部分源码吧 public final class String private final char value[]; 我们暂且只看这两行, 第一行String被final修 ...
- Linux启动之旅
引言 某出租房内,某台电脑的电源键被按下,于是开启了一段Linux启动之旅... BIOS 系统启动,首先进入BIOS. ● BIOS 为 Base Input/Output System(基本输入输 ...
- react-native-gesture-handler报错
安装React Native第三方组件出现Task :react-native-gesture-handler:compileDebugJavaWithJavac FAILED报错,则使用jetifi ...
- Mybatis学习笔记之---多表查询(1)
Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...
- 洛谷 P2016 战略游戏
题意简述简述 求一棵树的最小点覆盖 题解思路 树形DP dp[i][0]表示第i个点覆盖以i为根的子树的最小值,且第i个点不放士兵 dp[i][1]表示第i个点覆盖以i为根的子树的最小值,且第i个点放 ...
- EventEmitter的前端实现
EventEmitter简介 EventEmitter是Node.js的内置模块events提供的一个类,它是Node事件流的核心,EventEmitter是服务端的东西, 前端已经有event-em ...
- javascript——原型与继承
一.什么是继承? 继承是面向对象语言的一个重要概念.许多面向对象语言都支持两种继承方式:接口继承和实现继承:接口继承只继承方法签名,而实现继承则继承实际的方法.由于函数没有签名,所以ECMAScrip ...
- spring-boot-plus详细配置(五)
spring-boot-plus详细配置 公共配置 application.yml
- vscode保存代码,自动按照eslint规范格式化代码设置
# vscode保存代码,自动按照eslint规范格式化代码设置 编辑器代码风格一致,是前端代码规范的一部分.同一个项目,或者同一个小组,保持代码风格一致很必要.就拿vue项目来说,之前做的几个项目, ...
- 在ubuntu下使用CMake及VSCode对LoRaMac-node代码进行编译调试
准备工作 下载代码LoRaMac-node 阅读LoRaMac-node目录下的doc文件夹中的development-environment.md 开工 安装所需环境 CMaka( >= 3 ...