MXLogger
MXLogger 是一个基于 mmap 的跨平台日志收集库。支持 iOS、Android 和 Flutter。核心代码使用 c/c++。在 Flutter 上使用 ffi 进行调用,性能几乎与原生一致。数据序列化使用谷歌开源的 flat_buffers 实现,高效且稳定。
中文说明请点击这里
结构目前,MXLogger 主要解决日志写入和日志分析问题。日志报告时间由服务确定,MXLogger 已开放日志路径。需要开发调用原生平台并发送到自己的服务器的文件上传代码。
性能测试
测试环境
-
iphone11,系统版本 14.6
-
每条数据约为 134 字节,循环 100,000 次
-
测试 10 次,取平均值
-
将 Xcode 构建配置设置为 release
结果
- 0.13 秒
日志查看
- 为了解析生成的二进制数据,我编写了一个配套的解析工具,您可以在下面查看mxlogger_analyzer,它看起来是这样的。视频链接
- 您可以在搜索框中输入标签,以搜索标签属性。例如,输入name、msg等。
控制台
mxlogger_analyzer_desktop.mp4
- 如果您使用的是Mac,可以下载客户端。如果使用Windows,您可能需要自己配置Flutter环境,编译mxlogger_analyzer的源代码并打包exe文件。
- 如果您的项目是Project Flutter,则可以依赖mxlogger_analyzer_lib
dependencies:
mxlogger_analyzer_lib:^1.0.2
MXAnalyzer.showDebug(
_navigatorStateKey.currentState!.overlay!,
diskcachePath: _mxLogger.diskcachePath,
cryptKey: _mxLogger.cryptKey,
iv: _mxLogger.iv,
databasePath: "you database path")
它看起来是这样的 视频链接
mxlogger_analyzer_pckage.mp4
安装
iOS
pod 'MXLogger'
Android
实现 'io.github.coder-dongjiayi:mxlogger:latest.release'
Flutter
dependencies:
flutter_mxlogger: ^last
notice
不要在一个可能会被系统清理的目录中设置日志存储目录,如ios中的library/cache。MXLogger在写入数据时不检查目录是否存在,而是在启动时创建它。如果日志文件在应用运行时被系统清理,则程序不会报告错误或回放,但也不会记录日志。
-
iOS
MXLogger * logger = [MXLogger initializeWithNamespace:@"com.youdomain.logger.space",storagePolicy:MXStoragePolicyYYYYMMDD]; logger.maxDiskAge = 60*60*24*7; // a week logger.maxDiskSize = 1024 * 1024 * 10; // 10M logger.fileLevel = 0;// If the file write level is lower than this level, the log file will not be written to the file [logger debug:@"mxlogger" msg:@"this is debug" tag:@"network,action"]; [logger info:@"mxlogger" msg:@"this is info" tag:@"request"]; [logger warn:@"mxlogger" msg:@"this is warn" tag:@"step"]; [logger error:@"mxlogger" msg:@"this is error" tag:@"action"]; [logger fatal:@"mxlogger" msg:@"this is fatal" tag:@"reponse"];
-
Android
MXLogger logger = new MXLogger(this.getContext(),"com.djy.mxlogger"); logger.maxDiskAge = 60*60*24*7; // a week 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.setFileLevel(0); logger.debug("this is debug ", name: "mxlogger", tag: "tag1,tag2,tag3"); logger.info("this is info", name: "mxlogger", tag: "w"); logger.warn("this is warn", name: "mxlogger", tag: "w"); logger.error("this is error", name: "mxlogger", tag: "e"); logger.fatal("this fatal", name: "mxlogger", tag: "f");