Log4a 是一个基于 mmap, 高性能、高可用的 Android 日志收集框架

WHY Log4a:

如果觉得还不错,欢迎 start,fork。

Log4a 使用 mmap 文件映射内存作为缓存,可以在不牺牲性能的前提下最大化的保证日志的完整性。 日志首先会写入到 mmap 文件映射内存中,基于 mmap 的特性,即使用户强杀了进程,日志文件也不会丢失,并且会在下次初始化 Log4a 的时候回写到日志文件中。

对于移动开发者来说,针对一些用户反馈难以复现的线上问题,分析日志有时候是解决问题的必要手段。 但是日志的收集一直有个痛点,就是性能与日志完整性无法兼得。 要实现高性能的日志收集,势必要使用大量内存,先将日志写入内存中,然后在合适的时机将内存里的日志写入到文件系统中(flush), 如果在 flush 之前用户强杀了进程,那么内存里的内容会因此而丢失。 日志实时写入文件可以保证日志的完整性,但是写文件是 IO 操作,涉及到用户态与内核态的切换,相比较直接写内存会更耗时,UI 线程中频繁的写文件会造成卡顿,影响用户体验。

HOW:

使用方法与 android.util.Log 一致,不同的是你需要进行简单的配置,当然也预留了丰富的接口供拓展使用,更高级的配置可以查看Sample;

  1. 在 build.gradle 文件中添加依赖:
allprojects {repositories {maven { url 'https://jitpack.io' }}
}dependencies {compile 'com.github.pqpo:Log4a:v1.0.0'
}
  1. 设置并初始化Log4a:
AndroidAppender.Builder androidBuild = new AndroidAppender.Builder();File log = FileUtils.getLogDir(context);
String log_path = log.getAbsolutePath() + File.separator + "log.txt";
FileAppender.Builder fileBuild = new FileAppender.Builder(context).setLogFilePath(log_path);Logger logger = new Logger.Builder().enableAndroidAppender(androidBuild).enableFileAppender(fileBuild).create();Log4a.setLogger(logger);
  1. 使用方式与 android.util.Log 完全一致:
Log4a.i(TAG, "Hello,Log4a!");
  1. 选择在合适的时候刷新缓存或者释放内存
//在应用退出的时候刷新缓存
Log4a.flush();
//如果想要释放内存可以调用下面的方法,内部会调用刷新,下次使用需要重新初始化
Log4a.release();

性能测试

性能测试的代码位于 Sample 中,分别测试了 Log4a, android.util.Log, 直接写内存(将日志内容保存到 ArrayList 中), 实时写文件, 使用 Buffer 写文件 当然也可以自行下载 Sample APK,在你的设备上进行测试。

下面分别是在 Google Pixel 和 Moto X 中写1w条日志的测试情况:

Google Pixel Moto X

上图中 google pixel 的测试数据表格如下(按消耗时间排序):

设备 测试类型 消耗时间 日志是否完整 是否持久化 断电后能否保证日志完整
Google Pixel Mem 13ms Y N N
Google Pixel Log4a 50ms Y Y Y
Google Pixel File with Buffer 61ms Y Y N
Google Pixel Android Log 184ms N N N
Google Pixel File no Buffer 272ms Y Y Y

可以看出 Log4a 的写日志性能仅次于直接写内存,与使用 BufferOutputStream 写文件基本保持一致,事实上为了保证多线程安全性, Log4a 在写 mmap 内存的时候都是加锁的,在没锁的情况下可以更靠近直接写内存的速度(有兴趣的可以自行测试)。
BufferOutputStream 是将先数据缓存在内存中,之后再刷新进文件的,如果在刷新之前断电了或者强杀了进程,那么内存中的数据就会丢失无法恢复。Log4a 会在下次启动的时候恢复日志文件保证日志的完整性。

感谢

  • Tencent/mars
  • XLog

https://toutiao.io/posts/1dr63d/preview

高性能日志框架 Log4a 原理分析相关推荐

  1. Ajax框架及原理分析--视频

    Ajax框架及原理分析 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240576 AJ ...

  2. Android免Root环境下Hook框架Legend原理分析

    0x1 应用场景 现如今,免Root环境下的逆向分析已经成为一种潮流! 在2015年之前的iOS软件逆向工程领域,要想对iOS平台上的软件进行逆向工程分析,越狱iOS设备与安装Cydia是必须的!几乎 ...

  3. 日志框架实现数据采集分析和报警

    大家好,我是贺贺,随着课程设计.毕业设计的来临,不同专业的同学有不同的要求,比较常见的做一些应用软件,但是有些专业就比较变态了,需要做数据分析什么的,别说分析了,连数据的获取都不会. 初识日志 说起来 ...

  4. 你需要知道的高性能并发框架Disruptor原理

    Disruptor的小史 现在要是不知道Disruptor真的已经很outer了,Disruptor是英国外汇交易公司LMAX开发的一款开源的高性能队列,LMAX Disruptor是一个高性能的线程 ...

  5. 滴滴开源Android插件化框架VirtualAPK原理分析

    概述 滴滴出行公司的首个对外开源项目 - VirtualAPK.地址:github.com/didi/Virtua- 滴滴自行研发了这款插件化框架,功能全面.兼容性好,还能够适用于有耦合的业务插件,这 ...

  6. 【源码分享】WPF漂亮界面框架实现原理分析及源码分享

    1 源码下载 直接放出源码地址,为了编译源码,需要下载安装OSGi.NET插件框架安装包:http://www.iopenworks.com/. [1]框架安装包:MuiTreeNavVsPackag ...

  7. 【Spring 工厂】工厂设计模式、第一个Spring程序细节分析、整合日志框架

    Spring 引言 什么是 Spring? 工厂设计模式 简单工厂的设计 通用工厂的设计 通用工厂的使用方式 第一个 Spring 程序 环境搭建 Spring 的核心API 程序开发 细节分析 Sp ...

  8. ZAP日志框架lumberjack日志归档库的分析使用

    本次我们从官方例程的角度出发,来分析学习如何让zap日志框架动起来 一. Zap官方例程 1.加糖版 logger, _ := zap.NewProduction() defer logger.Syn ...

  9. 01、JUL日志(JDK自带日志框架,包含源码分析)

    文章目录 前言 一.JUL架构介绍 1.1.认识不同组件 1.2.Logger 1.3.Handler 二.输出日志信息 三.自定义日志级别配置 3.1.认识Level类 3.2.输出不同等级日志 3 ...

最新文章

  1. Redis使用认证密码登录
  2. 第六篇:协调和协定之组通信
  3. 18 Java面试之 Oracle 和 Mysql 数据库
  4. python标准类型内建模块_Python内建模块struct实例详解
  5. python中的pandas的两种基本使用_pandas中join()的两种应用方法
  6. GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站
  7. PHP项目中,记录错误日志
  8. Js实现动态插入删除文本框
  9. 组件通信-父组件为子组件传递数据-静态数据//动态数据 // 数据校验
  10. 【AS3代码】正则表达式的各种用法和小实例
  11. Kafka的介绍之一
  12. html开发列表搜索,前端实例练习 - 可搜索列表
  13. [渝粤教育] 西南科技大学 经济法学 在线考试复习资料(1)
  14. JSP之实现分页查询
  15. win10计算机性能设置,巧设置让Win10运行更流畅
  16. 播放最近的人人影视mp4视频出现了所有文字显示不正常的现象,及其解决方法
  17. cwRsync实现windows server文件定时自动同步
  18. Unix与Linux、Minx、Minix
  19. SPI Flash是什么?
  20. ios开发---音乐播放器之怎么获取音乐列表

热门文章

  1. [转]Oracle 初始化参数之cursor_sharing
  2. 创客运动引发第三次工业革命
  3. 分数运算C++代码实现
  4. 解决import keras后出现的一系列问题
  5. DCT C语言 修改了c程序以及matlab的程序
  6. Python科学画图小结
  7. (转)Python 用hashlib求中文字符串的MD5值
  8. 编程方法学8:信息隐藏
  9. Python学习笔记:Day 12 编写日志列表页
  10. 1.在Linux下如何使用软盘、光盘以及DOS等非Linux分区