Skip to content

Latest commit

 

History

History
230 lines (130 loc) · 8.04 KB

README_CN.md

File metadata and controls

230 lines (130 loc) · 8.04 KB

license Platform

MXLogger

MXLogger

MXLogger 是基于mmap内存映射机制的跨平台日志库,支持AES CFB 128位加密,支持iOS Android Flutter。核心代码使用C/C++实现, Flutter端通过ffi调用,性能几乎与原生一致。 底层序列化使用Google开源的flat_buffers实现,高效稳定。

整体结构如下

jiegoutu

MXLogger 目前主要是解决日志写入和日志分析的问题。至于日志上报时机,应该由业务决定,MXLogger已经把日志的路径暴露出来,需要开发调用原生平台的文件上传代码,传到自己的服务器,然后通过自己的服务器下载日志文件,再通过我提供的**mxlogger_analyzer ** 进行解析。如果觉的这个流程麻烦,也可以自己写web端的可视化页面,解析代码可以查看 mxlogger_analyzer 的源码。

性能测试

对比Xlog和 Logan

写入测试,以下仅为iOS端测试结果。(性能测试的demo代码可以点击这里下载)

测试环境

  • 测试设备 iphone11, 系统版本 14.6

  • 每条数据大小约为134个字节 for循环10万次

  • 测试10次,取平均值

  • 设置Xcode的 Build Configuration为release模式

测试结果

  • 写入速度 MXLogger 仅为0.13s 左右,xlog为0.57s 左右,而美团的Logan约为14.0s左右

    haoshi

日志文件体积

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. 那么在控制台下可以可以看到下面这样的输出信息。

jiegoutu

如果你使用的是Mac电脑你可以直接下载我写好的 客户端(https://github.com/coder-dongjiayi/MXLogger/blob/main/mxlogger_analyzer.dmg),把dmg里面的app拖到应用程序目录中就可以了。如果你使用的是windows系统,那么你可能需要自行配置Flutter环境,编译mxlogger_analyzer的源码打包出exe文件。因为个人精力有限,我可能只会关注mac端的适配情况。如果你有特殊的需求分析,可以直接读取这个SQL数据库,通过操作sql进行自己的定制分析。

如果你的工程是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

安装引入

iOS

pod 'MXLogger', '~> 1.2.3'

Android

implementation 'io.github.coder-dongjiayi:mxlogger:1.2.3'

Flutter

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");
    

后续版本迭代安排

  1. 日志文件压缩

参考代码