美文网首页
Android log tag设置,显示包名、类名、方法、行号

Android log tag设置,显示包名、类名、方法、行号

作者: 天敦敦 | 来源:发表于2019-04-26 12:09 被阅读0次

具体实现如下,主要是要先获取当前类类名的全路径,避免重名

/**
 * 根据类名获取当前调用的方法和行号
 * @param tag 类名
 * @return 前调用的方法和行号
 */
private static String getTag(String tag) {
    
    /* 获取该线程堆栈存储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。
    如果返回的数组不是零长度的,最后一个元素代表堆栈底。*/

    StackTraceElement[] temp = Thread.currentThread().getStackTrace();
    // temp[0] 表示getStackTrace方法,故排除,此处也可从下标记2取做默认值
    StackTraceElement method = temp[1];

    // 由于数组的第一个元素代表栈顶,它是该序列中最新的方法调用,所以正序遍历
    for (StackTraceElement stackTraceElement : temp) {
        // 根据程序类名全路径进行过滤,筛选出当前该类中被最新调用的方法
        if (stackTraceElement.getClassName().contains(tag)) {
            method = stackTraceElement;
            break;
        }
    }

    return method.getClassName() + "." + method.getMethodName() + "() (" + method.getLineNumber() + ")";
}

如此便能在 log 的 tag显示当前log所属类、方法、行,避免日志混淆问题,建议日志分级,release状态下优化性能

package com.ww7h.ww.common.utils;
import android.util.Log;

/**
 * Created by: Android Studio.
 * Project Nam: Android-common
 * PackageName: com.ww7h.ww.common.utils
 * DateTime: 2019/3/28 16:11
 *
 * @author ww
 */
public class LogUtil {
    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 EVERYTHING = 0;

    private static int level = EVERYTHING;

    public static void updateLevel(int l) {
        level = l;
    }

    public static void v(String tag, String msg){
        if(level <= VERBOSE){
            Log.v(getTag(tag), msg);
        }
    }

    public static void d(String tag, String msg){
        if(level <= DEBUG){
            Log.d(getTag(tag), msg);
        }
    }

    public static void i(String tag, String msg){
        if(level <= INFO){
            Log.i(getTag(tag), msg);
        }
    }

    public static void w(String tag, String msg){
        if(level <= WARN){
            Log.w(getTag(tag), msg);
        }
    }

    public static void e(String tag, String msg){
        if(level <= ERROR){
            Log.e(getTag(tag), msg);
        }
    }

    /**
     * 根据类名获取当前调用的方法和行号
     * @param tag 类名
     * @return 前调用的方法和行号
     */
    private static String getTag(String tag) {
        
        /* 获取该线程堆栈存储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。
        如果返回的数组不是零长度的,最后一个元素代表堆栈底。*/

        StackTraceElement[] temp = Thread.currentThread().getStackTrace();
        // temp[0] 表示getStackTrace方法,故排除,此处也可从下标记2取做默认值
        StackTraceElement method = temp[1];

        // 由于数组的第一个元素代表栈顶,它是该序列中最新的方法调用,所以正序遍历
        for (StackTraceElement stackTraceElement : temp) {
            // 根据程序类名全路径进行过滤,筛选出当前该类中被最新调用的方法
            if (stackTraceElement.getClassName().contains(tag)) {
                method = stackTraceElement;
                break;
            }
        }

        return method.getClassName() + "." + method.getMethodName() + "() (" + method.getLineNumber() + ")";
    }

}

相关文章

网友评论

      本文标题:Android log tag设置,显示包名、类名、方法、行号

      本文链接:https://www.haomeiwen.com/subject/lvjfnqtx.html