創建LogUtils工具類

在Android開發中,我們常常用打印log的方式來調試我們的應用。但是Android官方提供的Log類在實際項目使用中,也不是非常方便。當程序出現錯誤時,我們最希望的就是這個Log類能幫我們定位到是哪個類的哪個方法,甚至于是那一行出現了錯誤。這樣就能給我們的調試帶來很大的便利。同時我們也應該想到為了應用程序的安全起見,在app正式上線之前,我們應該要把打印日志的功能關閉掉,以防別人通過Log來破解你的應用。

現在附上自己寫的Log工具類,先來看測試效果

測試代碼:

測試代碼截圖

測試結果:

打印結果

注意:工具類中通過獲取當前線程堆棧信息來獲取所需信息,如果不了解,請參考資料 獲取當前線程狀態

import android.text.TextUtils;
import android.util.Log;

/**
 * LogUtils工具說明:
 * 1 只輸出等級大于等于LEVEL的日志
 * 所以在開發和產品發布后通過修改LEVEL來選擇性輸出日志.
 * 當LEVEL=NOTHING則屏蔽了所有的日志.
 * 2 v,d,i,w,e均對應兩個方法.
 * 若不設置TAG或者TAG為空則為設置默認TAG
 *
 * Created by Looper on 2016/6/8.
 */
public class LogUtils {

    public static final int VERBOSE = 1;
    public static final int DEBUG = 2;
    public static final int INFO = 3;
    public static final int WARN = 4;
    public static final int ERROR = 5;
    public static final int NOTHING = 6;
    public static final int LEVEL = VERBOSE;
    public static final String SEPARATOR = ", ";

    public static void v(String message) {
        if (LEVEL <= VERBOSE) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            String tag = getDefaultTag(stackTraceElement);
            Log.v(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void v(String tag, String message) {
        if (LEVEL <= VERBOSE) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            if (TextUtils.isEmpty(tag)) {
                tag = getDefaultTag(stackTraceElement);
            }
            Log.v(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void d(String message) {
        if (LEVEL <= DEBUG) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            String tag = getDefaultTag(stackTraceElement);
            Log.d(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void d(String tag, String message) {
        if (LEVEL <= DEBUG) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            if (TextUtils.isEmpty(tag)) {
                tag = getDefaultTag(stackTraceElement);
            }
            Log.d(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void i(String message) {
        if (LEVEL <= INFO) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            String tag = getDefaultTag(stackTraceElement);
            Log.i(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void i(String tag, String message) {
        if (LEVEL <= INFO) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            if (TextUtils.isEmpty(tag)) {
                tag = getDefaultTag(stackTraceElement);
            }
            Log.i(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void w(String message) {
        if (LEVEL <= WARN) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            String tag = getDefaultTag(stackTraceElement);
            Log.w(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void w(String tag, String message) {
        if (LEVEL <= WARN) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            if (TextUtils.isEmpty(tag)) {
                tag = getDefaultTag(stackTraceElement);
            }
            Log.w(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void e(String message) {
        if (LEVEL <= ERROR) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            String tag = getDefaultTag(stackTraceElement);
            Log.e(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    public static void e(String tag, String message) {
        if (LEVEL <= ERROR) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            if (TextUtils.isEmpty(tag)) {
                tag = getDefaultTag(stackTraceElement);
            }
            Log.e(tag, getLogInfo(stackTraceElement) + message);
        }
    }

    /**
     * 獲取默認的TAG名稱.
     * 比如在MainActivity.java中調用了日志輸出.
     * 則TAG為MainActivity
     */
    public static String getDefaultTag(StackTraceElement stackTraceElement) {
        String fileName = stackTraceElement.getFileName();
        String stringArray[] = fileName.split("\\.");
        String tag = stringArray[0];
        return tag;
    }

    /**
     * 輸出日志所包含的信息
     */
    public static String getLogInfo(StackTraceElement stackTraceElement) {
        StringBuilder logInfoStringBuilder = new StringBuilder();
        // 獲取線程名
        String threadName = Thread.currentThread().getName();
        // 獲取線程ID
        long threadID = Thread.currentThread().getId();
        // 獲取文件名.即xxx.java
        String fileName = stackTraceElement.getFileName();
        // 獲取類名.即包名+類名
        String className = stackTraceElement.getClassName();
        // 獲取方法名稱
        String methodName = stackTraceElement.getMethodName();
        // 獲取日志輸出行數
        int lineNumber = stackTraceElement.getLineNumber();

        logInfoStringBuilder.append("[ ");
//        logInfoStringBuilder.append("threadID=" + threadID).append(SEPARATOR);
//        logInfoStringBuilder.append("threadName=" + threadName).append(SEPARATOR);
         logInfoStringBuilder.append("fileName=" + fileName).append(SEPARATOR);
//        logInfoStringBuilder.append("className=" + className).append(SEPARATOR);
        logInfoStringBuilder.append("methodName=" + methodName).append(SEPARATOR);
        logInfoStringBuilder.append("lineNumber=" + lineNumber);
        logInfoStringBuilder.append(" ] ");
        return logInfoStringBuilder.toString();
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,523評論 0 17
  • 《必然3》| 秋秋解讀 關于作者 凱文·凱利,人稱 KK,《連線》雜志創始主編,硅谷最著名的預言家,第一屆黑客大會...
    艷云美甲正姿護眼筆閱讀 587評論 0 0
  • 臨智永真草千字文,
    柳上惠2閱讀 161評論 0 1