一个轻量的 Android 端日志打印记录库

地址:https://github.com/yhaolpz/PLog

PLog 即 Persistence Log,可持久化日志于文件,便于还原用户使用场景,解决异常问题。

特性:

1.mmap 方式高效写入,规避 IO 操作带来的性能消耗

2.兼容多进程并发文件写入,日志文件保存在各自的进程目录下

3.通过 zip 压缩并加密,节省上报流量,保护日志私密性

4.内置收集 Activity/Fragment 生命周期、崩溃、网络状态等常用信息:

集成:

     //配置工程 gradle
     maven { url 'https://jitpack.io' }

     // dependencies
     implementation 'com.github.yhaolpz:PLog:1.1'

使用

1.初始化
    PLog.Config config = new PLog.Config.Builder(this)
            .logDir(mLogDirPath) //日志存放目录,默认优先存储于SD卡
            .logcatDebugLevel(PLog.DebugLevel.DEBUG) //允许输出到Logcat的级别
            .recordDebugLevel(PLog.DebugLevel.DEBUG) //允许记录到日志文件的级别
            .fileSizeLimitDay(15) //单天日志文件存储上限
            .overdueDay(3) //日志文件过期天数
            .cipherKey("123456") //日志密钥
            .build();
    PLog.init(config);
2.打印
    //普通打印
    PLog.d("wyh", "This is a log that can be recorded in a file");

    //Format
    PLog.d("wyh", "This is a %s", "log");

    //数组类型
    PLog.d("wyh", new String[]{"a", "b", "c"});
    //output: [a,b,c]
3.只记录到日志文件
    PLog.record(PLog.DebugLevel.DEBUG,"wyh","This is a log that can only be recorded in files");
4.只输出到logcat
    PLog.print(PLog.DebugLevel.DEBUG,"wyh","This is a log");
5.触发上传
    PLog.upload(new UploadListener() {
        @Override
        public void upload(@NonNull List<File> files) {
            //上传到你的服务端
            //...

            //建议上传成功及时删除日志文件
            for (File file : files) {
                 if (file.exists()) {
                    file.delete();
                 }
            }
        }
    });

存储逻辑

日志文件类型

为更好的区分并管理日志,将从写入到上传经历不同状态的日志文件划分为以下类型:

  • “-mmap” 正在写入的日志文件,不可上传,文件命名为: yyyy-MM-dd-mmap
  • "-mmap-up" 写入完成的日志文件,可压缩上传,文件命名为: yyyy-MM-dd-mmap-up
  • "-mmap-up-old" 单天较早写入完成的日志大小,可压缩上传,文件命名为: yyyy-MM-dd-mmap-up-old
  • "-mmap-up-last" 触发上传时超出存储上限部分的日志文件,上传操作的中间态,不会长久存在,可压缩上传,文件命名为: yyyy-MM-dd-mmap-up-last
  • ".zip" 已压缩加密的日志文件,可直接上传,文件命名为: yyyy-MM-dd HH:mm:ss.zip

控制日志时效

暂定保留最近三天的日志,更早的日志将会在特定时机自动清除当前进程目录所有类型过期的日志文件,这些时机包括:

  • 初始化时
  • 触发上传重命名日志文件添加"-up"时
  • 触发上传压缩所有标记为"-up"的可上传的日志时
  • 触发上传扫描所有".zip"可上传的日志时

控制存储上限

理论上我们应该避免无意义的日志记录滥用,控制日志体积,但为避免极端情况下大量日志写入导致存储爆炸,通过将日志文件分为两片控制存储上限。

譬如规定单天日志存储体积上限为 MAX,逻辑大致为下:

  • 当天日志文件 -mmap 写入体积达 MAX/3 时就会停止写入,并命名为 -mmap-up,然后新建文件 -mmap 继续写入
  • 当写入达 MAX/3 时,先将已存在的 -mmap-up 命名为 -mmap-up-old,再将刚写满的 -mmap 命名为 -mmap-up,然后新建文件 -mmap 继续写入
  • 当写入达 MAX/3 时,先删除 -mmap-up-old 文件,将已存在的 -mmap-up 命名为 -mmap-up-old,再将刚写满的 -mmap 命名为 -mmap-up,然后新建文件 -mmap 继续写入

按照此逻辑,假定当天写入日志体积为 SIZE,可以将单天日志存储情况划分为以下几种状态:

  • a. SIZE < MAX/3
  • b. MAX/3 < SIZE < MAX*2/3
  • c. MAX*2/3 < SIZE < MAX

当处于 a 状态时触发上传: -mmap --> -mmap-up --> zip
当处于 b 状态时触发上传: -mmap-up --> -mmap-up-old --> zip ; -mmap --> -mmap-up --> zip
当处于 c 状态时触发上传: -mmap-up-old --> zip ; -mmap-up --> zip ; -mmap --> -mmap-up-last --> zip

为了防止频繁的判断日志体积,可设置每隔一定写入条数后判断一次进行优化,目前设置间隔为 1000 条。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,256评论 0 9
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,833评论 0 5
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,743评论 0 8
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,726评论 0 30
  • 少玩手机多做题
    你怕是没被我胖虎打过阅读 179评论 0 1