当前位置: 代码迷 >> 综合 >> log日志中输出log所在类,方法和行数
  详细解决方案

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

热度:34   发布时间:2024-02-09 11:19:10.0

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

 

 

 

  相关解决方案