用户登录
用户注册

分享至

log日志中输出log所在类,方法和行数

  • 作者: 丶妖冶叔叔
  • 来源: 51数据库
  • 2021-07-28

android开发中,log日志如果能同时显示发生log所在的类,方法名和行数,更方便我们定位。

获取的方法如下:

 /**
     * 得到tag(所在类.方法(L:行))
     * @return
     */
    private static String generateTag() {
        StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[0];
        String callerClazzName = stackTraceElement.getClassName();
        callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
        String tag = "%s.%s(L:%d)";
        tag = String.format(tag, new Object[]{callerClazzName, stackTraceElement.getMethodName(), Integer.valueOf(stackTraceElement.getLineNumber())});
        //给tag设置前缀
        tag = TextUtils.isEmpty(tagPrefix) ? tag : tagPrefix + ":" + tag;
        return tag;
    }

解释下代码:

每个线程都有与之对应的堆栈信息,代码中通过线程可以拿到这些堆栈信息。

其中 Thread.currentThread().getStackTrace()这个方法得到的是个数组,

第一个元素[0]是栈最顶端的栈信息,

最后一个元素是栈最底部的,正常应该是main方法的信息。


来看看StackTraceElement的部分代码:

public final class StackTraceElement implements java.io.Serializable {
    // Normally initialized by VM (public constructor added in 1.5)
    private String declaringClass;
    private String methodName;
    private String fileName;
    private int    lineNumber;

其中declaringClass:是类名的全路径

methodName:当前方法名

lineNumber:所在行数。

怎么使用我们写的 generateTag 方法呢?如下

  public static void d(String msg) {
        if (showD) {
            String tag = generateTag();
            Log.d(tag, msg);
        }
    }

最后附上整个类代码:


import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * log日志封装类
 */
public class LogUtil {
    public static String tagPrefix = "";
    public static boolean showV = true;
    public static boolean showD = true;
    public static boolean showI = true;
    public static boolean showW = true;
    public static boolean showE = true;
    public static boolean writeInFile = true;

    /**
     * 得到tag(所在类.方法(L:行))
     * @return
     */
    private static String generateTag() {
        StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[0];
        String callerClazzName = stackTraceElement.getClassName();
        callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
        String tag = "%s.%s(L:%d)";
        tag = String.format(tag, new Object[]{callerClazzName, stackTraceElement.getMethodName(), Integer.valueOf(stackTraceElement.getLineNumber())});
        //给tag设置前缀
        tag = TextUtils.isEmpty(tagPrefix) ? tag : tagPrefix + ":" + tag;
        return tag;
    }

    public static void setShow(boolean isShow){
        showV = isShow;
        showD = isShow;
        showI = isShow;
        showW = isShow;
        showE = isShow;
        writeInFile = isShow;
    }
 
    public static void v(String msg) {
        if (showV) {
            String tag = generateTag();
            Log.v(tag, msg);
        }
    }
 
    public static void v(String msg, Throwable tr) {
        if (showV) {
            String tag = generateTag();
            Log.v(tag, msg, tr);
        }
    }
 
    public static void d(String msg) {
        if (showD) {
            String tag = generateTag();
            Log.d(tag, msg);
        }
    }
 
    public static void d(String msg, Throwable tr) {
        if (showD) {
            String tag = generateTag();
            Log.d(tag, msg, tr);
        }
    }
 
    public static void i(String msg) {
        if (showI) {
            String tag = generateTag();
            Log.i(tag, msg);
        }
    }
 
    public static void i(String msg, Throwable tr) {
        if (showI) {
            String tag = generateTag();
            Log.i(tag, msg, tr);
        }
    }
 
    public static void w(String msg) {
        if (showW) {
            String tag = generateTag();
            Log.w(tag, msg);
        }
    }
 
    public static void w(String msg, Throwable tr) {
        if (showW) {
            String tag = generateTag();
            Log.w(tag, msg, tr);
        }
    }
 
    public static void e(String msg) {
        if (showE) {
            String tag = generateTag();
            Log.e(tag, msg);
        }
    }
 
    public static void e(String msg, Throwable tr) {
        if (showE) {
            String tag = generateTag();
            Log.e(tag, msg, tr);
        }
    }


    public static void showLog(String tag, String msg) {
        //	boolean debug = true;//是否debug,true表示处于debug状态,不可输错日志
        if (showD) {
            Log.i(tag, msg);
        }
    }
    public static void writeInFile(Context context,String msg) {
        return;
//        if (writeInFile){
//            String  bath=getFileCrashPath(context);
//            LogUtil.d("===bath===" + bath);
//            PrintToFileUtil.input2File(msg,bath+File.separator+"log.txt");
//        }
    }
    public static final String getCachePath(Context context) {
        return Environment.getExternalStorageDirectory().toString() ;
    }
    public static final String getFileCrashPath(Context context) {
        String path = getCachePath(context) + File.separator + "aaaaaaa"+getMillisecondFormatTime(System.currentTimeMillis());

        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        return path;
    }
    /**
     * 将返回的毫秒值转换为yyyy-MM-dd 时间格式
     *
     * @return
     */
    public final static String getMillisecondFormatTime(long datetiem) {

        Date date = new Date(datetiem);
        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");

        return sdf.format(date);

    }
}

?

?

?

软件
前端设计
程序设计
Java相关