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

在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: ddddddd
11-07 09:48:27.703 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee
11-07 09:48:27.703 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii
11-07 09:48:27.703 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv
11-07 09:48:27.703 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww

11-07 09:48:27.703 22447-22447/com.mylogutiltest D/MainActivity: ddddddd
11-07 09:48:27.703 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee
11-07 09:48:27.703 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii
11-07 09:48:27.703 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv
11-07 09:48:27.703 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww

11-07 09:48:27.713 22447-22447/com.mylogutiltest D/MainActivity: [1] onCreate: ddddddd
11-07 09:48:27.713 22447-22447/com.mylogutiltest E/MainActivity: [1] onCreate: eeeeeee
11-07 09:48:27.733 22447-22447/com.mylogutiltest I/MainActivity: [1] onCreate: iiiiiii
11-07 09:48:27.733 22447-22447/com.mylogutiltest V/MainActivity: [1] onCreate: vvvvvvv
11-07 09:48:27.733 22447-22447/com.mylogutiltest W/MainActivity: [1] onCreate: wwwwwww

11-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) ]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,我们经常会使用Log来打印日志。但是,Android原生的Log输出信息有限,为了更好地输出和管理日志,我们可以自定义LogUtil。 下面是一个简单的LogUtil,可以自定义输出日志级别、输出信息格式等: ```java public class LogUtil { private static final String TAG = "LogUtil"; private static boolean sDebug = true; // 是否打印日志 private static boolean sSaveLog = false; // 是否保存日志到文件 private static String sLogPath = Environment.getExternalStorageDirectory().getPath() + "/log.txt"; // 日志保存路径 public static void setDebug(boolean debug) { sDebug = debug; } public static void setSaveLog(boolean saveLog) { sSaveLog = saveLog; } public static void setLogPath(String logPath) { sLogPath = logPath; } public static void v(String msg) { if (sDebug) { Log.v(TAG, msg); } saveLogToFile("V", TAG, msg); } public static void d(String msg) { if (sDebug) { Log.d(TAG, msg); } saveLogToFile("D", TAG, msg); } public static void i(String msg) { if (sDebug) { Log.i(TAG, msg); } saveLogToFile("I", TAG, msg); } public static void w(String msg) { if (sDebug) { Log.w(TAG, msg); } saveLogToFile("W", TAG, msg); } public static void e(String msg) { if (sDebug) { Log.e(TAG, msg); } saveLogToFile("E", TAG, msg); } private static void saveLogToFile(String level, String tag, String msg) { if (sSaveLog) { try { File file = new File(sLogPath); FileWriter fw = new FileWriter(file, true); BufferedWriter bw = new BufferedWriter(fw); bw.write("[" + level + "] " + tag + ": " + msg + "\n"); bw.close(); fw.close(); } catch (IOException e) { Log.e(TAG, "saveLogToFile: " + e.getMessage()); } } } } ``` 使用方法: ```java LogUtil.setDebug(true); // 设置是否打印日志 LogUtil.setSaveLog(true); // 设置是否保存日志到文件 LogUtil.setLogPath("/sdcard/log.txt"); // 设置日志保存路径 LogUtil.v("verbose log"); LogUtil.d("debug log"); LogUtil.i("info log"); LogUtil.w("warning log"); LogUtil.e("error log"); ``` 以上就是一个简单的LogUtil的实现,可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值