Android-外功篇-MyLogger自定义Log

本文介绍了三种不同类型的自定义日志记录器实现方法,包括原始版、改进版及网上抄袭版。这些日志记录器可用于Android应用开发中,帮助开发者更方便地控制日志输出等级,并提供额外的功能如打印调用栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.原始版
public class MyLogger {
    private final String TAG = "你的应用程序名";//使用时换做自己的application名
    //private boolean isDebug = android.os.Build.TYPE.startsWith("user") ? Log.isLoggable(TAG, Log.DEBUG) : true;
    private boolean isDebug = true;
    private String mClassName;

    public MyLogger(String name) {
        mClassName = name;
    }

    public void v(String log) {
        if (isDebug) {
            Log.v(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void d(String log) {
        if (isDebug) {
            Log.d(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void i(String log) {
        if (isDebug) {
            Log.i(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void i(String log, Throwable tr) {
        if (isDebug) {
            Log.i(TAG, "[" + mClassName + "]:" + log + "\n"
                    + Log.getStackTraceString(tr));
        }
    }

    public void w(String log) {
        if (isDebug) {
            Log.w(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void w(String log, Throwable tr) {
        if (isDebug) {
            Log.w(TAG, "[" + mClassName + "]:" + log + "\n"
                    + Log.getStackTraceString(tr));
        }
    }

    public void e(String log) {
        if (isDebug) {
            Log.e(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void e(String log, Throwable tr) {
        if (isDebug) {
            Log.e(TAG, "[" + mClassName + "]:" + log + "\n"
                    + Log.getStackTraceString(tr));
        }
    }
}

使用方法:
|作为每个类的成员变量,实例化是传入该类的类名,如:MainActivity
public final MyLogger LOG = new MyLogger(“MainActivity”);
LOG.i(“onCreate”);直接在需要处使用即可。
|release时将isDebug的值改为false,就可以不再打印log。

2.改进版
public class MyLogger {
    private final String TAG = "你的应用程序名";//使用时换做自己的application名
    //private boolean isDebug = android.os.Build.TYPE.startsWith("user") ? Log.isLoggable(TAG, Log.DEBUG) : true;
    private boolean isDebug = true;
    private String mClassName;
    public int curLogLevel = Log.VERBOSE;//当前需要打印的log等级

    public MyLogger(String name) {
        mClassName = name;
    }

    public void v(String log) {
        if (curLogLevel > Log.VERBOSE) {  
            return;  
        } 
        if (isDebug) {
            Log.v(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void d(String log) {
        if (curLogLevel > Log.DEBUG) {  
            return;  
        } 
        if (isDebug) {
            Log.d(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void i(String log) {
        if (curLogLevel > Log.INFO) {  
            return;  
        } 
        if (isDebug) {
            Log.i(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void i(String log, Throwable tr) {
        if (curLogLevel > Log.INFO) {  
            return;  
        } 
        if (isDebug) {
            Log.i(TAG, "[" + mClassName + "]:" + log + "\n"
                    + Log.getStackTraceString(tr));
        }
    }

    public void w(String log) {
        if (curLogLevel > Log.WARN) {  
            return;  
        } 
        if (isDebug) {
            Log.w(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void w(String log, Throwable tr) {
        if (curLogLevel > Log.WARN) {  
            return;  
        } 
        if (isDebug) {
            Log.w(TAG, "[" + mClassName + "]:" + log + "\n"
                    + Log.getStackTraceString(tr));
        }
    }

    public void e(String log) {
        if (curLogLevel > Log.ERROR) {  
            return;  
        } 
        if (isDebug) {
            Log.e(TAG, "[" + mClassName + "]:" + log);
        }
    }

    public void e(String log, Throwable tr) {
        if (curLogLevel > Log.ERROR) {  
            return;  
        } 
        if (isDebug) {
            Log.e(TAG, "[" + mClassName + "]:" + log + "\n"
                    + Log.getStackTraceString(tr));
        }
    }
}

用法一样,只是增加了打印等级控制curLogLevel

3.网上抄袭版

原文出自:http://blog.youkuaiyun.com/iplayvs2008/article/details/40422999

public class LogUtils {  
    private static StackTraceElement[] currentThread;  
    private static String tagName;  
    private static String msgT;  
    private static String msgC;  
    private static String callTraceStack;  
    private static int curLogLevel = Log.VERBOSE;  

    public static int getCurLogLevel() {  
        return curLogLevel;  
    }  
    public static void setCurLogLevel(int curLogLevel) {  
        LogUtils.curLogLevel = curLogLevel;  
    }  
    public synchronized static void initTrace(String msg, int... isPrintStack) {  
        int isPrintStackOne = isPrintStack.length > 0 ? isPrintStack[0] : 10;  
        currentThread = Thread.currentThread().getStackTrace();  
        // vm调用栈中此方法所在index:2:VMStack.java:-2:getThreadStackTrace()<--Thread.java:737:getStackTrace()<--  
        int curentIndex = 4;  
        String className = currentThread[curentIndex].getFileName();  
        int endIndex = className.lastIndexOf(".");  
        tagName = endIndex < 0 ? className : className.substring(0, endIndex);  
        msgT = "[" + className + ":" + currentThread[curentIndex].getLineNumber() + ":"  
                + currentThread[curentIndex].getMethodName() + "()]---";  
        msgC = "msg:[" + msg + "]";  
        if (isPrintStackOne > 0) {  
            StringBuilder sb = new StringBuilder();  
            sb.append("callTraceStack:[");  
            for (int i = curentIndex; i < curentIndex + isPrintStackOne && i < currentThread.length; i++) {  
                sb.append(currentThread[i].getFileName() + ":" + currentThread[i].getLineNumber() + ":"  
                        + currentThread[i].getMethodName() + "()" + "<--");  
            }  
            sb.append("]");  
            callTraceStack = sb.toString();  
            msgC += callTraceStack;  
        }  
    }  
    public static void e(String msg, boolean printStack) {  
        e(msg, printStack ? 105 : 0);  
    }  
    public static void w(String msg, boolean printStackNum) {  
        w(msg, printStackNum ? 105 : 0);  
    }  
    public static void d(String msg, boolean printStackNum) {  
        d(msg, printStackNum ? 105 : 0);  
    }  
    public static void v(String msg, boolean printStackNum) {  
        v(msg, printStackNum ? 105 : 0);  
    }  
    public static void i(String msg, boolean printStackNum) {  
        i(msg, printStackNum ? 105 : 0);  
    }  
    public static void e(String msg, int... printStackNum) {  
        if (curLogLevel > Log.ERROR) {  
            return;  
        }  
        initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);  
        Log.e(tagName, msgT + msgC);  
    }  
    public static void w(String msg, int... printStackNum) {  
        if (curLogLevel > Log.WARN) {  
            return;  
        }  
        initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);  
        Log.w(tagName, msgT + msgC);  
    }  
    public static void d(String msg, int... printStackNum) {  
        if (curLogLevel > Log.DEBUG) {  
            return;  
        }  
        initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);  
        Log.d(tagName, msgT + msgC);  
    }  
    public static void v(String msg, int... printStackNum) {  
        if (curLogLevel > Log.VERBOSE) {  
            return;  
        }  
        initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);  
        Log.v(tagName, msgT + msgC);  
    }  
    public static void i(String msg, int... printStackNum) {  
        if (curLogLevel > Log.INFO) {  
            return;  
        }  
        initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);  
        Log.i(tagName, msgT + msgC);  
    }  
} 

说明:
1. 使用方式:LogUtil.v(“~test~”);
2.
public static void v(String msg, int… printStackNum)中printStackNum为可选参数,表示打印多少层调用栈
3.
curLogLevel表示当前打印日志的最低等级,比如设置为Log.INFO,则info以上的打印,以下的不打印,这样在Debug阶段,设置为
Log.VERBOSE,在Release阶段设置为Log.ERROR或者Log.ASSERT,就可以不打印哪些调试日志
4. 这样使用Thread.currentThread().getStackTrace(),效率可能比较低,调试可以用,发行版本,最好关闭日志如果有大神有优化方案,不吝指点一二。

总结:
|-第二种一直在用,只是麻烦在每次使用需要在各个类中实例化,传入各自的类名。
|-第三种比较方便,但是可能性能稍差吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值