Android之系统Log输出日志的封装类LogUtil

来源:互联网 发布:中国居民膳食指南 知乎 编辑:程序博客网 时间:2024/04/27 16:37

在Android开发过程中经常用到Log,在日志打印中,我们需要频繁定义日志的TAG,并且日志内容不能输出方法名,线程ID以及行数等。于是就定义了一个基于这个需求的日志辅助类——LogUtil工具类。

自定义的LogUtil工具类如下:

package com.mylogutiltest;import android.util.Log;import java.util.Locale;public class LogUtil {    private static boolean LOGV = true;    private static boolean LOGD = true;    private static boolean LOGI = true;    private static boolean LOGW = true;    private static boolean LOGE = true;    // 直接使用Log    public static void v(String tag, String mess) {        if (LOGV) { Log.v(tag, mess); }    }    public static void d(String tag, String mess) {        if (LOGD) { Log.d(tag, mess); }    }    public static void i(String tag, String mess) {        if (LOGI) { Log.i(tag, mess); }    }    public static void w(String tag, String mess) {        if (LOGW) { Log.w(tag, mess); }    }    public static void e(String tag, String mess) {        if (LOGE) { Log.e(tag, mess); }    }    /**     * 获取到调用者的类名     * @return 调用者的类名     */    private static String getTag() {        StackTraceElement[] trace = new Throwable().fillInStackTrace()                .getStackTrace();        String callingClass = "";        for (int i = 2; i < trace.length; i++) {            Class<?> clazz = trace[i].getClass();            if (!clazz.equals(LogUtil.class)) {                callingClass = trace[i].getClassName();                callingClass = callingClass.substring(callingClass                        .lastIndexOf('.') + 1);                break;            }        }        return callingClass;    }    //不需要再在类中定义TAG,直接打印日志信息    public static void v1(String mess) {        if (LOGV) { Log.v(getTag(), mess); }    }    public static void d1(String mess) {        if (LOGD) { Log.d(getTag(), mess); }    }    public static void i1(String mess) {        if (LOGI) { Log.i(getTag(), mess); }    }    public static void w1(String mess) {        if (LOGW) { Log.w(getTag(), mess); }    }    public static void e1(String mess) {        if (LOGE) { Log.e(getTag(), mess); }    }    /**     * 获取线程ID,方法名和输出信息     * @param msg     * @return     */    private static String buildMessage(String msg) {        StackTraceElement[] trace = new Throwable().fillInStackTrace()                .getStackTrace();        String caller = "";        for (int i = 2; i < trace.length; i++) {            Class<?> clazz = trace[i].getClass();            if (!clazz.equals(LogUtil.class)) {                caller = trace[i].getMethodName();                break;            }        }        return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread()                .getId(), caller, msg);    }    //不需要再在类中定义TAG,打印线程ID,方法名和输出信息    public static void v2(String mess) {        if (LOGV) { Log.v(getTag(), buildMessage(mess)); }    }    public static void d2(String mess) {        if (LOGD) { Log.d(getTag(), buildMessage(mess)); }    }    public static void i2(String mess) {        if (LOGI) { Log.i(getTag(), buildMessage(mess)); }    }    public static void w2(String mess) {        if (LOGW) { Log.w(getTag(), buildMessage(mess)); }    }    public static void e2(String mess) {        if (LOGE) { Log.e(getTag(), buildMessage(mess)); }    }    //不需要再在类中定义TAG,打印类名,方法名,行号等.并定位行    public static void v3(String mess) {        if (LOGV) { Log.v(getTag(), getMsgFormat(mess)); }    }    public static void d3(String mess) {        if (LOGD) { Log.d(getTag(), getMsgFormat(mess)); }    }    public static void i3(String mess) {        if (LOGI) { Log.i(getTag(), getMsgFormat(mess)); }    }    public static void w3(String mess) {        if (LOGW) { Log.w(getTag(), getMsgFormat(mess)); }    }    public static void e3(String mess) {        if (LOGE) { Log.e(getTag(), getMsgFormat(mess)); }    }    /**     * 获取相关数据:类名,方法名,行号等.用来定位行     * @return     */    private static String getFunctionName() {        StackTraceElement[] sts = Thread.currentThread().getStackTrace();        if (sts != null) {            for (StackTraceElement st : sts) {                if (st.isNativeMethod()) {                    continue;                }                if (st.getClassName().equals(Thread.class.getName())) {                    continue;                }                if (st.getClassName().equals(LogUtil.class.getName())) {                    continue;                }                return "[ Thread:" + Thread.currentThread().getName() + ", at " + st.getClassName() + "." + st.getMethodName()                        + "(" + st.getFileName() + ":" + st.getLineNumber() + ")" + " ]";            }        }        return null;    }    /**     * 输出格式定义     * @param msg     * @return     */    private static String getMsgFormat(String msg) {        return msg + " ;" + getFunctionName();    }}

MainActivity.java文件 :

package com.mylogutiltest;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {    public static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 直接使用Log        LogUtil.d(TAG, "ddddddd");        LogUtil.e(TAG, "eeeeeee");        LogUtil.i(TAG ,"iiiiiii");        LogUtil.v(TAG, "vvvvvvv");        LogUtil.w(TAG, "wwwwwww");        //不需要再在类中定义TAG,直接打印日志信息        LogUtil.d1("ddddddd");        LogUtil.e1("eeeeeee");        LogUtil.i1("iiiiiii");        LogUtil.v1("vvvvvvv");        LogUtil.w1("wwwwwww");        //不需要再在类中定义TAG,打印线程ID,方法名和输出信息        LogUtil.d2("ddddddd");        LogUtil.e2("eeeeeee");        LogUtil.i2("iiiiiii");        LogUtil.v2("vvvvvvv");        LogUtil.w2("wwwwwww");        //不需要再在类中定义TAG,打印类名,方法名,行号等.并定位行        LogUtil.d3("ddddddd");        LogUtil.e3("eeeeeee");        LogUtil.i3("iiiiiii");        LogUtil.v3("vvvvvvv");        LogUtil.w3("wwwwwww");    }}

结果打印:

11-07 09:48:27.703 22447-22447/com.mylogutiltest D/MainActivity: ddddddd11-07 09:48:27.703 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee11-07 09:48:27.703 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii11-07 09:48:27.703 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv11-07 09:48:27.703 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww11-07 09:48:27.703 22447-22447/com.mylogutiltest D/MainActivity: ddddddd11-07 09:48:27.703 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee11-07 09:48:27.703 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii11-07 09:48:27.703 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv11-07 09:48:27.703 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww11-07 09:48:27.713 22447-22447/com.mylogutiltest D/MainActivity: [1] onCreate: ddddddd11-07 09:48:27.713 22447-22447/com.mylogutiltest E/MainActivity: [1] onCreate: eeeeeee11-07 09:48:27.733 22447-22447/com.mylogutiltest I/MainActivity: [1] onCreate: iiiiiii11-07 09:48:27.733 22447-22447/com.mylogutiltest V/MainActivity: [1] onCreate: vvvvvvv11-07 09:48:27.733 22447-22447/com.mylogutiltest W/MainActivity: [1] onCreate: wwwwwww11-07 09:48:27.733 22447-22447/com.mylogutiltest D/MainActivity: ddddddd ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:35) ]11-07 09:48:27.733 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:36) ]11-07 09:48:27.733 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:37) ]11-07 09:48:27.733 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:38) ]11-07 09:48:27.743 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:39) ]
0 0