说明: 本文只讨论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日志搜集原理及方案比较的更多相关文章

  1. 解析 Android Things 技术原理

    2012 年 6 月,由 IoT-GSI(Global Standards Initiative on Internet of Things)发布的白皮书“ITU-T Y.4000/Y.2060”[1 ...

  2. android MultiDex multidex原理原理下遇见的N个深坑(二)

    android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...

  3. Android消息推送完美方案[转]

    转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...

  4. android MultiDex multiDex原理(一)

    android MultiDex 原理(一) Android分包MultiDex原理详解 转载请注明:http://blog.csdn.net/djy1992/article/details/5116 ...

  5. nginx 日志搜集解决方案

    # nginx 日志搜集解决方案 ## 系统环境描述 ``` java8 logstash --监控nginx日志文件 ``` ## 技术描述 ``` 通过logstash监控nginx access ...

  6. K8S学习笔记之K8S日志搜集实战

    详细参考这篇文章,几乎覆盖了了K8S的各种日志搜集方案 https://juejin.im/post/5b6eaef96fb9a04fa25a0d37#heading-8

  7. Android日志猫的使用

    Android日志猫的使用 Android给我们提供了一个Log类,这个类有一些方法,比如 我们可以在我们的代码中添加这些方法进行测试 package com.example.test; import ...

  8. Android数据库加密之sqlciher方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6241964.html 前言 大家好,我是Cavalier ...

  9. Atitti.java android反编译解决方案-----虚拟机方案

    Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...

随机推荐

  1. 数据结构之堆栈C++版

    /* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 ...

  2. (15)ASP.NET Core Web主机(IWebHostBuilder)

    1.前言 ASP.NET Core应用程序可以配置和启动主机(Host).主机负责应用程序启动和生存期管理,配置服务器和请求处理管道.主机还可以设置日志记录.依赖关系注入和配置.而host主机又包括W ...

  3. 暴风雨中的 online :.net core 版博客站点遭遇的高并发问题进展

    今天暴风雨袭击了杭州,而昨天暴风雨(高并发问题)席卷了园子,留下一片狼藉. 在前天傍晚,我们进行了 .net core 版博客站点的第二次发布尝试,在发布后通过 kestrel 直接监听取代 ngin ...

  4. 1、JAVA的小白之路

    大学的时光过得很快,转眼我已经大二了,在大一时,学习了C\C++,对于语言有一定基础,在未来的道路上,我需要攒足干劲,积累足够的知识和技能,去走上社会. 我的第一任大学班主任告诉我:“作为程序员,你至 ...

  5. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  6. React Native-路由跳转

    搭建完RN开发环境后(搭建方式可查看https://www.cnblogs.com/luoyihao/p/11178377.html),要实现多个页面之间的跳转. 1.这时需要安装react-navi ...

  7. mybatis的一对多双向映射

    连表查询 select id resultType resultMap resultType和resultMap不能同时使用 association 属性 映射到多对一中的“一”方的“复杂类型”属性, ...

  8. MapReduce on Yarn运行原理

    一.概念综述 MapReduce是一种可用于数据处理的编程模型(或计算模型),该模型可以比较简单,但想写出有用的程序却不太容易.MapReduce能将大型数据处理任务分解成很多单个的.可以在服务器集群 ...

  9. 防止Web攻击,做好HTTP安全标头

    前言   下图是几年前一位女性在访谈会上提问Linus(Linux操作系统之父) 为什么英伟达显卡在Linux系统中兼容性这么差? Linus说他们曾经去和英伟达谈过关于显卡在Linux上兼容的问题, ...

  10. 记一次 Windows MySQL 恢复

    0x00 事件 因为本地的服务器硬件出现故障,导致一台 Windows 系统的开发环境挂了,且无法短时间内恢复状态. 应急方案是使用了云上的系统重建了开发环境. 开发人员说需要挂了的那台 Window ...