Android日誌通過logcat實時輸出至文件

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)。

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