安卓日誌文件的寫入與管理

在項目開發中,經常需要通過日誌來進行調試和疑難排查。而日誌持久化是真正開發線上app必不可少的。安卓本身的Log類,是將日誌輸出到控制檯,並不能輸出到文件。本文介紹一個簡單實用的LogUtils的用法和實現邏輯,可以將Log寫出到日誌中,給大家做參考。源碼在此:log-to-file
使用該LogUtils類,需要在Application的onCreate中添加初始化代碼,如下:

private void initLog() {
    LogUtils.setLogDir(YiqiConfig.getLogFolderPath());
    if (EnvironmentUtils.getVersionName().toLowerCase().contains("beta")) {
        LogUtils.setLogLevel(LogUtils.LogLevel.DEBUG);
    } else {
        // 爲了保護隱私和保證log的整潔,正式版上只打比warn高的log,即warn, error和assert
        LogUtils.setLogLevel(LogUtils.LogLevel.WARN);
    }
}

用法和android.utils.Log一樣,方法名和參數都一一對應。增加的功能就是在輸出到控制檯之後,還會輸出到日誌文件中,以及管理日誌文件的個數。單個日誌文件的大小和日誌文件的個數都可以在代碼中設置。

private static final int LOG_FILES_MAX_NUM = 5; //文件最多有5個
private static final int LOG_FILE_MAX_SIZE = 1024 * 1024; //文件最大1MB

當寫滿一個文件時,創建新的日誌文件,如果文件個數超過最大數,就刪掉最老的日誌文件。
主要邏輯下面這個方法中:

private File getNewLogFile() {
    File dir = new File(mLogFileDir);
    File[] files = dir.listFiles(fileFilter);
    if (files == null || files.length == 0) {
        // 創建新文件
        return createNewLogFile();
    }
    List<File> sortedFiles = sortFiles(files);
    if (files.length > LOG_FILES_MAX_NUM) {
        // 刪掉最老的文件
        FileUtils.delete(sortedFiles.get(0));
    }
    // 取最新的文件,看寫沒寫滿
    File lastLogFile = sortedFiles.get(sortedFiles.size() - 1);
    if (lastLogFile.length() < LOG_FILE_MAX_SIZE) {
        return lastLogFile;
    } else {
        // 創建新文件
        return createNewLogFile();
    }
}

首先判斷是否沒有任何日誌文件,如果是,直接創建新的日誌文件;如果已經存在日誌文件,判斷當前日誌文件個數是否超過最大數,如果超過,則刪掉最老的日誌文件;最後再判斷最新的文件是否寫滿,沒寫滿直接寫在該文件中,寫滿的話,就新建一個新的文件。



作者:InnerNight
鏈接:https://www.jianshu.com/p/548c7b18397e
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章