Android log打印不出來

有時候,不知道爲什麼,android 的log 會打印不出來。懷疑是某一個時刻,log 打印太多導致。或者有其他原因。

這時候,如果不能調試,只能看log 的話,那麼真的需要log 排查問題。但是log 老是在關鍵的地方不打印,怎麼辦?

package com.zhangyue.iReader.tools;

import android.content.Context;
import android.os.Environment;
import android.util.Log;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import static com.zhangyue.iReader.app.PATH.FOLDER_NAME;

/**
 * =======================================================================================
 * 作    者:caoxinyu
 * 創建日期:2020/3/6.
 * 類的作用:
 * 修訂歷史:
 * =======================================================================================
 */
public class LogToFile {
    private static String TAG = "LogToFile";

    private static String logPath = null;//log日誌存放路徑

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH", Locale.US);//日期格式;

    private static Date date = new Date();//因爲log日誌是使用日期命名的,使用靜態成員變量主要是爲了在整個程序運行期間只存在一個.log文件中;

    /**
     * 初始化,須在使用之前設置,最好在Application創建時調用
     *
     * @param context
     */
    public static void init(Context context) {
        logPath = getFilePath(context) + "/Logs";//獲得文件儲存路徑,在後面加"/Logs"建立子文件夾
//        logPath = getFilePath(context);//獲得文件儲存路徑,在後面加"/Logs"建立子文件夾
    }

    /**
     * 獲得文件存儲路徑
     *
     * @return
     */
    private static String getFilePath(Context context) {

        if (Environment.MEDIA_MOUNTED.equals(Environment.MEDIA_MOUNTED) || !Environment.isExternalStorageRemovable()) {//如果外部儲存可用
            return context.getExternalFilesDir(null).getPath();//獲得外部存儲路徑,默認路徑爲 /storage/emulated/0/Android/data/com.waka.workspace.logtofile/files/Logs/log_2016-03-14_16-15-09.log
        } else {
            return context.getFilesDir().getPath();//直接存在/data/data裏,非root手機是看不到的
        }
    }

    private static final char VERBOSE = 'v';

    private static final char DEBUG = 'd';

    private static final char INFO = 'i';

    private static final char WARN = 'w';

    private static final char ERROR = 'e';

    public static void v(String tag, String msg) {
        writeToFile(VERBOSE, tag, msg);
    }

    public static void d(String tag, String msg) {
        writeToFile(DEBUG, tag, msg);
    }

    public static void i(String tag, String msg) {
        writeToFile(INFO, tag, msg);
    }

    public static void w(String tag, String msg) {
        writeToFile(WARN, tag, msg);
    }

    public static void e(String tag, String msg) {
        writeToFile(ERROR, tag, msg);
    }

    /**
     * 將log信息寫入文件中
     *
     * @param type
     * @param tag
     * @param msg
     */
    private static void writeToFile(char type, String tag, String msg) {

        if (null == logPath) {
            Log.e(TAG, "logPath == null ,未初始化LogToFile");
            return;
        }

        String fileName = logPath + "/log_" + dateFormat.format(new Date()) + ".log";//log日誌名,使用時間命名,保證不重複
        String log = dateFormat.format(date) + " " + type + " " + tag + " " + msg + "\n";//log日誌內容,可以自行定製

        //如果父路徑不存在
        File file = new File(logPath);
        if (!file.exists()) {
            file.mkdirs();//創建父路徑
        }

        FileOutputStream fos = null;//FileOutputStream會自動調用底層的close()方法,不用關閉
        BufferedWriter bw = null;
        try {

            fos = new FileOutputStream(fileName, true);//這裏的第二個參數代表追加還是覆蓋,true爲追加,flase爲覆蓋
            bw = new BufferedWriter(new OutputStreamWriter(fos));
            bw.write(log);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bw != null) {
                    bw.close();//關閉緩衝流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

在你的打印log 的地方,用這個工具類,幫助你打印log 的時候,直接寫到文件裏面。這樣就不會丟掉任何的log。

方便快速排查問題。

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