# Log4a **Repository Path**: cmzl_ohos/log4a ## Basic Information - **Project Name**: Log4a - **Description**: 基于 mmap, 高性能、高可用的 OpenHarmony 日志收集框架 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-07-12 - **Last Updated**: 2024-01-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Log4a Log4a 是一个基于 mmap, 高性能、高可用的日志收集框架 ## WHY Log4a: Log4a 使用 mmap 文件映射内存作为缓存,可以在不牺牲性能的前提下最大化的保证日志的完整性。 日志首先会写入到 mmap 文件映射内存中,基于 mmap 的特性,即使用户强杀了进程,日志文件也不会丢失,并且会在下次初始化 Log4a 的时候回写到日志文件中。 对于移动开发者来说,针对一些用户反馈难以复现的线上问题,分析日志有时候是解决问题的必要手段。 但是日志的收集一直有个痛点,就是性能与日志完整性无法兼得。 要实现高性能的日志收集,势必要使用大量内存,先将日志写入内存中,然后在合适的时机将内存里的日志写入到文件系统中(flush), 如果在 flush 之前用户强杀了进程,那么内存里的内容会因此而丢失。 日志实时写入文件可以保证日志的完整性,但是写文件是 IO 操作,涉及到用户态与内核态的切换,相比较直接写内存会更耗时,UI 线程中频繁的写文件会造成卡顿,影响用户体验。 ![](art/overview.gif) ## 集成 ##### 方法1: 直接使用har包 ``` 通过library生成har包,添加har包到要集成的libs文件夹内 在entry的gradle内添加如下代码 implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) ``` ##### 方法2: gradle依赖 ``` allprojects{ repositories{ mavenCentral() } } implementation "com.gitee.archermind-ti:Log4a:1.0.0" ``` ## 使用说明 1. 设置并初始化Log4a: https://gitee.com/archermind-ti/log4a/blob/master/entry/src/main/java/me/pqpo/log4a/LogInit.java 2. 使用方式: ``` Log4a.i(TAG, "Hello,Log4a!"); ``` 3. 选择在合适的时候刷新缓存**或者**释放内存 ``` //在应用退出的时候刷新缓存 Log4a.flush(); //如果想要释放内存可以调用下面的方法,内部会调用刷新,下次使用需要重新初始化 Log4a.release(); ``` ## 性能测试 性能测试的代码位于 entry 中,分别测试了 Log4a, HiLog, 直接写内存(将日志内容保存到 ArrayList 中), 实时写文件, 使用 Buffer 写文件 经过测试分析写1w条日志的测试情况: Log4a 的写日志性能仅次于直接写内存,与使用 BufferOutputStream 写文件基本保持一致,事实上为了保证多线程安全性, Log4a 在写 mmap 内存的时候都是加锁的,在没锁的情况下可以更靠近直接写内存的速度(有兴趣的可以自行测试)。 BufferOutputStream 是将先数据缓存在内存中,之后再刷新进文件的,如果在刷新之前断电了或者强杀了进程,那么内存中的数据就会丢失无法恢复。Log4a 会在下次启动的时候恢复日志文件保证日志的完整性。 ![](art/test.jpg) ## 备注 原库iOS的demo部分未移植,因为Android和iOS的三方库demo的功能上是一样的,根据对应功能只做了Android的demo实现。 ## License Copyright 2017 pqpo Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.