欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-03-03 19:56:07
android开发中,log日志如果能同时显示发生log所在的类,方法名和行数,更方便我们定位。获取的方法如下: /** * 得到tag(所在类.方法(L:行)) * @return */ private static String generateTag() { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[0]; St...

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);

    }
}

 

 

 

本文地址:https://blog.csdn.net/jinshitou2012/article/details/107928194