MXLogger 是基于mmap内存映射机制的跨平台日志库,支持AES CFB 128位加密,支持iOS Android Flutter。核心代码使用C/C++实现, Flutter端通过ffi调用,性能几乎与原生一致。 底层序列化使用Google开源的flat_buffers实现,高效稳定。
MXLogger 目前主要是解决日志写入和日志分析的问题。至于日志上报时机,应该由业务决定,MXLogger已经把日志的路径暴露出来,需要开发调用原生平台的文件上传代码,传到自己的服务器,然后通过自己的服务器下载日志文件,再通过我提供的**mxlogger_analyzer ** 进行解析。如果觉的这个流程麻烦,也可以自己写web端的可视化页面,解析代码可以查看 mxlogger_analyzer 的源码。
写入测试,以下仅为iOS端测试结果。(性能测试的demo代码可以点击这里下载)
测试环境
-
测试设备 iphone11, 系统版本 14.6
-
每条数据大小约为134个字节 for循环10万次
-
测试10次,取平均值
-
设置Xcode的 Build Configuration为release模式
测试结果
日志文件体积
Logan 和 Xlog对数据进行了压缩,实际产生的体积会比较小。
MXLogger | Xlog | Logan |
---|---|---|
14008320 byte (14M) | 905753 byte(0.9M) | 922452 byte(0.9M) |
-
日志查看
为了解析产出的二进制数据,我写了一个配套的可以查看的解析工具mxlogger_analyzer,他大概长下面这个样子。 视频链接
mxlogger_analyzer_desktop.mp4
-
你可以在搜索框输入
tag:
用于单独搜索tag属性。name
msg
同理。 -
控制台输出 如果设置console = YES. 那么在控制台下可以可以看到下面这样的输出信息。
如果你的工程是Flutter工程,你想在app内实时查看日志你可以在工程中依赖mxlogger_analyzer_lib
dependencies:
mxlogger_analyzer_lib:^1.0.4
使用方法
MXAnalyzer.showDebug(
_navigatorStateKey.currentState!.overlay!,
diskcachePath: _mxLogger.diskcachePath,
cryptKey: _mxLogger.cryptKey,
iv: _mxLogger.iv,
databasePath: "数据库路径")
大概长下面这个样子 视频链接
mxlogger_analyzer_pckage.mp4
pod 'MXLogger', '~> 1.2.3'
implementation 'io.github.coder-dongjiayi:mxlogger:1.2.3'
dependencies:
flutter_mxlogger: ^1.2.3
设置日志存储目录不要设置在一个可能被系统清理的目录 比如说 ios 的library/cache
下,MXLogger并不会在每次写入数据的时候检测目录是否存在,只会在启动的时候创建,如果再app运行中日志文件被系统清理,程序不会报错,也不会闪退,但是日志也不会被记录。
更详细的使用,请查看demo
关于日志加密的说明
MXLogger 提供AES CFB 128为加密机制,代码来自于MMKV,加密逻辑使用汇编实现,最大程度保障了写入性能。加密使用的cryptKey和iv 应为长度16的英文字符串。
MXLogger 提供按月、周、天、小时,4种存储策略。默认情况下是按天存储。
yyyy_MM 按月存储
yyyy_MM_dd 按天存储
yyyy_ww 按周存储
yyyy_MM_dd_HH 按小时存储
设置控制台输出
setConsoleEnable
- 这个方法用于开启/关闭控制台输出,对于日志写入磁盘没有影响
- debug情况下可以设置为true,方便开发者直接在控制台查看日志,但是app发布到线上,强烈建议设置为false.
关于
setLevel
- 用于设置日志文件写入等级,只写入>= 这个等级的日志。比如设置 level=2,那么
debug
和info
的日志会被抛弃,只会写入wran
error
和fatal
的数据
初始化,以及基本使用
-
iOS
MXLogger * logger = [MXLogger initializeWithNamespace:@"com.youdomain.logger.space",storagePolicy:MXStoragePolicyYYYYMMDD]; logger.maxDiskAge = 60*60*24*7; // 一个星期 logger.maxDiskSize = 1024 * 1024 * 10; // 10M logger.level = 0;// 设置文件写入等级 小于这个等级的日志 不写入文件 [logger debug:@"mxlogger" msg:@"这是debug信息" tag:@"network,action"]; //多个tag可以使用,分割 [logger info:@"mxlogger" msg:@"这是info信息" tag:@"request"]; [logger warn:@"mxlogger" msg:@"这是warn信息" tag:@"step"]; [logger error:@"mxlogger" msg:@"这是error信息" tag:@"action"]; [logger fatal:@"mxlogger" msg:@"这是fatal信息" tag:@"reponse"];
-
Android
MXLogger logger = new MXLogger(this.getContext(),"com.djy.mxlogger"); logger.maxDiskAge = 60*60*24*7; // 一个星期 logger.maxDiskSize = 1024 * 1024 * 10; // 10M logger.debug("request","mxlogger","this is debug",tag:"tag1,tag2,tag3"); logger.info("response","mxlogger","this is info"); logger.warn("tag","mxlogger","this is warn"); logger.error("404","mxlogger","this is error"); logger.fatal("200","mxlogger","this is fatal");
-
Flutter
MXLogger logger = await MXLogger.initialize( nameSpace: "flutter.mxlogger", storagePolicy: MXStoragePolicyType.yyyy_MM_dd, cryptKey: "abcuioqbsdguijlk", iv: "bccuioqbsdguijiv"); logger.setMaxDiskAge(60*60*24*7); logger.setMaxDiskSize(1024*1024*10); logger.setLevel(0); logger.debug("这是debug数据", name: "mxlogger", tag: "tag1,tag2,tag3"); logger.info("这是info数据", name: "mxlogger", tag: "w"); logger.warn("这是warn数据", name: "mxlogger", tag: "w"); logger.error("这是error数据", name: "mxlogger", tag: "e"); logger.fatal("这是fatal数据", name: "mxlogger", tag: "f");
- 日志文件压缩