Android日誌通過logcat實時輸出至文件
一、前言
相信在開發結束後,開發者在開發完成後,將apk發給測試人員,會出現一下很尷尬的問題。
測試人員:**,點擊按鈕1-》進入頁面A-》點擊按鈕2-》返回-》再點擊-》出現XX問題!!!
開發人員:嗯?我按照你說的測試一遍沒有出現問題啊?哄我呢?*_*
測試人員:不闊能,我測試好幾遍了,都會出現。
開發人員:哦?拿你手機給我用用。
.....
測試人員:**,用完了沒,我沒手機啦。
開發人員:稍等稍等
(內心獨白:啥鬼東西,ta咋出現的???見鬼)
.....
.....
實際上在測試過程中,很可能會出現這種問題的,客觀因數很多,你寫的bug原因也很多,應該怎麼解決呢?重新模擬一次嗎?也許不可能重現呢;產生問題的手機模擬嗎?emmm,一般情況下可以,但是也可能不行,也許你人品好了點呢。而且這些處理方法都相當於重複工作了。接下來就是這個類出現的契機了。
二、利用logcat系統方法將日誌輸出到文件中
核心代碼
/**
* 開始收集日誌信息
*/
public static void createLogCollector(String path) {
if (path == null) {
Log.d("LogUtils", "未設置path");
return;
}
new Thread(){
@Override
public void run() {
super.run();
try {
String cmdCollect = path + logFileDate.format(Calendar.getInstance().getTime()) + ".txt";
try {
List<String> commandList = new ArrayList<>();
commandList.add("logcat");
commandList.add("-f");
commandList.add(cmdCollect);
commandList.add("-v");
commandList.add("time");
commandList.add(TAG + ":I");
commandList.add("System.err:W");// 過濾所有的錯誤信息
commandList.add("System.out:I");// 過濾所有的錯誤信息
commandList.add("AndroidRuntime:E"); //運行報錯
// 過濾指定TAG的信息
commandList.add(TAG + ":V");
commandList.add(TAG + ":D");
commandList.add("*:S");
try {
Process process = Runtime.getRuntime().exec(commandList.toArray(new String[commandList.size()]));
Thread.sleep(1000);
} catch (Exception e) {
Log.e(TAG, "CollectorThread == >" + e.getMessage(), e);
}
} catch (Exception ex) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}catch (Exception ex){
Log.d(TAG , ex.getMessage());
}
Log.d(TAG ,"收集日誌循環已完全啓動!!!");
}
}.start();
}
以上代碼實際上就相當於執行了系統的logcat方法,其中的主要參數有輸出文件路徑、已經過濾需要輸出到文件中的TAG。
注:系統會依據是否能夠寫入然後寫入文件中,如果無存儲權限的話,則不會輸出文件,執行一次過後纔開始寫入文件。
外部調用方式:
static{
if (BuildConfig.DEBUG) {
LogUtils.TAG = "com.test";
LogUtils.createLogCollector(FileConstants.VA_LOG_PATH);
}
}
博主調用方式是寫在Application靜態代碼塊中,一次執行即可。
源碼地址(提取碼: rk53)。