日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高性能日志框架 Log4a 原理分析

發布時間:2025/3/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高性能日志框架 Log4a 原理分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Log4a 是一個基于 mmap, 高性能、高可用的 Android 日志收集框架

WHY Log4a:

如果覺得還不錯,歡迎 start,fork。

Log4a 使用 mmap 文件映射內存作為緩存,可以在不犧牲性能的前提下最大化的保證日志的完整性。 日志首先會寫入到 mmap 文件映射內存中,基于 mmap 的特性,即使用戶強殺了進程,日志文件也不會丟失,并且會在下次初始化 Log4a 的時候回寫到日志文件中。

對于移動開發者來說,針對一些用戶反饋難以復現的線上問題,分析日志有時候是解決問題的必要手段。 但是日志的收集一直有個痛點,就是性能與日志完整性無法兼得。 要實現高性能的日志收集,勢必要使用大量內存,先將日志寫入內存中,然后在合適的時機將內存里的日志寫入到文件系統中(flush), 如果在 flush 之前用戶強殺了進程,那么內存里的內容會因此而丟失。 日志實時寫入文件可以保證日志的完整性,但是寫文件是 IO 操作,涉及到用戶態與內核態的切換,相比較直接寫內存會更耗時,UI 線程中頻繁的寫文件會造成卡頓,影響用戶體驗。

HOW:

使用方法與 android.util.Log 一致,不同的是你需要進行簡單的配置,當然也預留了豐富的接口供拓展使用,更高級的配置可以查看Sample;

  • 在 build.gradle 文件中添加依賴:
  • allprojects {repositories {maven { url 'https://jitpack.io' }} }dependencies {compile 'com.github.pqpo:Log4a:v1.0.0' }
  • 設置并初始化Log4a:
  • AndroidAppender.Builder androidBuild = new AndroidAppender.Builder();File log = FileUtils.getLogDir(context); String log_path = log.getAbsolutePath() + File.separator + "log.txt"; FileAppender.Builder fileBuild = new FileAppender.Builder(context).setLogFilePath(log_path);Logger logger = new Logger.Builder().enableAndroidAppender(androidBuild).enableFileAppender(fileBuild).create();Log4a.setLogger(logger);
  • 使用方式與 android.util.Log 完全一致:
  • Log4a.i(TAG, "Hello,Log4a!");
  • 選擇在合適的時候刷新緩存或者釋放內存
  • //在應用退出的時候刷新緩存 Log4a.flush(); //如果想要釋放內存可以調用下面的方法,內部會調用刷新,下次使用需要重新初始化 Log4a.release();

    性能測試

    性能測試的代碼位于 Sample 中,分別測試了 Log4a, android.util.Log, 直接寫內存(將日志內容保存到 ArrayList 中), 實時寫文件, 使用 Buffer 寫文件 當然也可以自行下載 Sample APK,在你的設備上進行測試。

    下面分別是在 Google Pixel 和 Moto X 中寫1w條日志的測試情況:

    Google PixelMoto X

    上圖中 google pixel 的測試數據表格如下(按消耗時間排序):

    設備測試類型消耗時間日志是否完整是否持久化斷電后能否保證日志完整
    Google PixelMem13msYNN
    Google PixelLog4a50msYYY
    Google PixelFile with Buffer61msYYN
    Google PixelAndroid Log184msNNN
    Google PixelFile no Buffer272msYYY

    可以看出 Log4a 的寫日志性能僅次于直接寫內存,與使用 BufferOutputStream 寫文件基本保持一致,事實上為了保證多線程安全性, Log4a 在寫 mmap 內存的時候都是加鎖的,在沒鎖的情況下可以更靠近直接寫內存的速度(有興趣的可以自行測試)。
    BufferOutputStream 是將先數據緩存在內存中,之后再刷新進文件的,如果在刷新之前斷電了或者強殺了進程,那么內存中的數據就會丟失無法恢復。Log4a 會在下次啟動的時候恢復日志文件保證日志的完整性。

    感謝

    • Tencent/mars
    • XLog

    https://toutiao.io/posts/1dr63d/preview

    總結

    以上是生活随笔為你收集整理的高性能日志框架 Log4a 原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。