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