在項目開發中,經常需要通過日誌來進行調試和疑難排查。而日誌持久化是真正開發線上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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。