Android的Log包裝輸出

在Android開發(fā)過程中經(jīng)常使用Log打印一些調(diào)試的信息,比如:

Log.d(TAG, "xxxxx");

但是,每一個(gè)類都要定義一個(gè)TAG,一般TAG等于類名本身,比較繁瑣.更重要的是,每次還要帶上這個(gè)參數(shù).如果打印的信息比較多或者一個(gè)類的代碼數(shù)量比較長時(shí),不太方便查找Log的位置.那么有沒有一種方法,解決上面的問題呢?

問題分析

  1. 每個(gè)類的TAG等于類名,那么能不能自己去尋找類名呢?
  2. 能不能找到打印log所在的位置呢?

答案是肯定的!在Java中可以使用Throwable類獲取棧的信息.

StackTraceElement[] elements = new Throwable().getStackTrace();
String className = elements[1].getFileName();
String methodName = elements[1].getMethodName();
int lineNumber = elements[1].getLineNumber();

通過此方法可以獲取類名,方法名,行號信息.獲取到信息后還需在包裝一下,因?yàn)槭荄ebug時(shí)的Log就取名DLog吧.
那么Dlog中肯定要有一個(gè)Log的實(shí)例,還要與Log方法同名的方法,比如v(),d(),e(),w(),i()等.如下所示:

public class DLog {
    private static String className;            //所在的類名
    private static String methodName;           //所在的方法名
    private static int lineNumber;              //所在行號

    /**
     * 私有化構(gòu)造器
     */
    private DLog() {}

    /**
     * 是否處于調(diào)試模式
     */
    public static boolean isDebuggable() {
        return BuildConfig.DEBUG;
    }

    /**
     * 創(chuàng)建Log信息
     */
    private static String createLog(String log) {

        StringBuffer buffer = new StringBuffer();
        buffer.append("[");
        buffer.append(methodName);
        buffer.append(":");
        buffer.append(lineNumber);
        buffer.append("]");
        buffer.append(log);

        return buffer.toString();
    }

    /**
     * 獲取類名,方法名,行號
     */
    private static void getMethodNames(StackTraceElement[] sElements) {
        className = sElements[1].getFileName();
        methodName = sElements[1].getMethodName();
        lineNumber = sElements[1].getLineNumber();
    }
    
    public static void v(String message) {
        if (!isDebuggable()) {
            return;
        }

        getMethodNames(new Throwable().getStackTrace());
        Log.v(className, createLog(message));
    }

    public static void d(String message) {
        if (!isDebuggable()) {
            return;
        }


        getMethodNames(new Throwable().getStackTrace());
        Log.d(className, createLog(message));
    }

    public static void i(String message) {
        if (!isDebuggable()) {
            return;
        }

        getMethodNames(new Throwable().getStackTrace());
        Log.i(className, createLog(message));
    }

    public static void w(String message) {
        if (!isDebuggable()) {
            return;
        }

        getMethodNames(new Throwable().getStackTrace());
        Log.w(className, createLog(message));
    }
    
    public static void e(String message) {
        if (!isDebuggable()) {
            return;
        }

        getMethodNames(new Throwable().getStackTrace());
        Log.e(className, createLog(message));
    }
}

這樣好了,即能自己找到類名,又能打印出Log信息所在的位置.且慢,還有一個(gè)問題:

如果一個(gè)項(xiàng)目中使用了很多Log輸出,項(xiàng)目結(jié)束時(shí)又不允許在打印這些信息怎么辦?難道要一個(gè)一個(gè)刪除?

一個(gè)一個(gè)刪除太麻煩了,誰讓我們都想偷懶呢!為何我們不在上面的那個(gè)類加個(gè)控制,不想輸出可以一鍵屏蔽多好呀.

Log中的信息是有類別的,我們可以給每個(gè)類別分個(gè)序號,在來一個(gè)控制序號的級別,這樣就可以控制顯示的類別,

/**
 * 包裝后的Log輸出,可控制顯示哪些級別的LOG
 * @author Administrator
 *
 */
public class DLog {
    private static String className;            //所在的類名
    private static String methodName;           //所在的方法名
    private static int lineNumber;              //所在行號
    
    public static final int VERBOSE = 1;          //顯示Verbose及以上的Log
    public static final int DEBUG = 2;          //顯示Debug及以上的Log
    public static final int INFO = 3;           //顯示Info及以上的Log
    public static final int WARN = 4;           //顯示W(wǎng)arn及以上的Log
    public static final int ERROR = 5;          //顯示Error及以上的Log
    public static final int NOTHING = 6;        //全部不顯示
    
    public static final int LEVEL = VERBOSE;    //控制顯示的級別

    private DLog() {
    }

    public static boolean isDebuggable() {
        return BuildConfig.DEBUG;
    }

    private static String createLog(String log) {

        StringBuffer buffer = new StringBuffer();
        buffer.append("[");
        buffer.append(methodName);
        buffer.append(":");
        buffer.append(lineNumber);
        buffer.append("]");
        buffer.append(log);

        return buffer.toString();
    }

    private static void getMethodNames(StackTraceElement[] sElements) {
        className = sElements[1].getFileName();
        methodName = sElements[1].getMethodName();
        lineNumber = sElements[1].getLineNumber();
    }
    
    public static void v(String message) {
        if (!isDebuggable()) {
            return;
        }

        if (LEVEL <= VERBOSE) {
            getMethodNames(new Throwable().getStackTrace());
            Log.v(className, createLog(message));
        }
    }

    public static void d(String message) {
        if (!isDebuggable()) {
            return;
        }

        if (LEVEL <= DEBUG) {
            getMethodNames(new Throwable().getStackTrace());
            Log.d(className, createLog(message));
        }
    }

    public static void i(String message) {
        if (!isDebuggable()) {
            return;
        }

        if (LEVEL <= INFO) {
            getMethodNames(new Throwable().getStackTrace());
            Log.i(className, createLog(message));
        }
    }

    public static void w(String message) {
        if (!isDebuggable()) {
            return;
        }

        if (LEVEL <= WARN) {
            getMethodNames(new Throwable().getStackTrace());
            Log.w(className, createLog(message));
        }
    }
    
    public static void e(String message) {
        if (!isDebuggable()) {
            return;
        }

        if (LEVEL <= ERROR) {
            getMethodNames(new Throwable().getStackTrace());
            Log.e(className, createLog(message));
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末古徒,一起剝皮案震驚了整個(gè)濱河市瓦胎,隨后出現(xiàn)的幾起案子契邀,更是在濱河造成了極大的恐慌逛腿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件史侣,死亡現(xiàn)場離奇詭異枢贿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)省骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門莺奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冀宴,你說我怎么就攤上這事灭贷。” “怎么了略贮?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵甚疟,是天一觀的道長仗岖。 經(jīng)常有香客問我,道長览妖,這世上最難降的妖魔是什么轧拄? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮讽膏,結(jié)果婚禮上檩电,老公的妹妹穿的比我還像新娘。我一直安慰自己府树,他們只是感情好俐末,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奄侠,像睡著了一般卓箫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垄潮,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天烹卒,我揣著相機(jī)與錄音,去河邊找鬼弯洗。 笑死旅急,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牡整。 我是一名探鬼主播坠非,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼果正!你這毒婦竟也來了炎码?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秋泳,失蹤者是張志新(化名)和其女友劉穎潦闲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫皱,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歉闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卓起。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片和敬。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖戏阅,靈堂內(nèi)的尸體忽然破棺而出昼弟,到底是詐尸還是另有隱情,我是刑警寧澤奕筐,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布舱痘,位于F島的核電站变骡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芭逝。R本人自食惡果不足惜塌碌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旬盯。 院中可真熱鬧台妆,春花似錦、人聲如沸胖翰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡态。三九已至,卻和暖如春迂卢,著一層夾襖步出監(jiān)牢的瞬間某弦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工而克, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靶壮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓员萍,卻偏偏與公主長得像腾降,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子碎绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,989評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理螃壤,服務(wù)發(fā)現(xiàn),斷路器筋帖,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 26,837評論 5 19
  • 感恩清靜的每一天奸晴,干凈平和,充滿著希望和祝福日麸。憧憬著美好的未來我們一起在國外的66號公路相擁的情景寄啼,想想都美好。 ...
    棋心118閱讀 178評論 0 0