一個輕量的 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 條。