Android技巧之封装Log工具类

时间:2021-08-21 20:07:43

1.前言

开发过程中打日志已成为我们平时Debug调试不可缺少的一部分,Android SDK给我们也提供了很不错的工具类,并且分了不同的日志级别:Log.v() Log.d() Log.i() Log.w() and Log.e() 分别对应 VERBOSE,DEBUG,INFO, WARN, ERROR,其中Verbose不会在release版本中被编译进应用程序包中,而Debug日志根据Android API说会在运行时被去掉,另外的三个则会一直被保留。

2.问题

官方建议我们打日志的通用做法是:在你的类中声明一个常量TAG,如下

private static final String TAG = "MyActivity";

使用:

Log.v(TAG, "index=" + i);

细心的童鞋可能觉得官方给的有很多不足的地方,例如每个类都要声明TAG,日志不能追踪哪个类,哪个方法、哪一行,某些日志在App发布时不能自动删除,还需要手动修改或者删除等等。这里针对这些问题整理一些小技巧。

3.实践

1.去掉TAG:我们可以用类名来作为TAG的内容,获取方法名和行数:

private static void getMethodNames(StackTraceElement[] sElements){
className = sElements[1].getFileName();
methodName = sElements[1].getMethodName();
lineNumber = sElements[1].getLineNumber();
}

2.发布时去除日志
Android的BuildConfig有一个很合适的DEBUG可以用,它在你发布release版本,这个bool值自动变为false;所以我们可以利用这一点,重新定义写Log的方法:

public static void v(String message){
if (!BuildConfig.DEBUG)
return;

getMethodNames(new Throwable().getStackTrace());
Log.v(className, createLog(message));
}

3.封装成方法

private static String createLog( String log ) {
StringBuffer buffer = new StringBuffer();
buffer.append(methodName);
buffer.append("(").append(className).append(":").append(lineNumber).append(")");
buffer.append(log);
return buffer.toString();
}

这样出来的结果就是:可以通过连接直接跳转到指定的文件的那一行
Android技巧之封装Log工具类
当然你也可以根据自己的喜好,修改要打印出来的格式。

完整代码:

public class LogUtils {
static String className;//类名
static String methodName;//方法名
static int lineNumber;//行数

private LogUtils(){
/* Protect from instantiations */
}

public static boolean isDebuggable() {
return BuildConfig.DEBUG;
}

private static String createLog( String log ) {
StringBuffer buffer = new StringBuffer();
buffer.append(methodName);
buffer.append("(").append(className).append(":").append(lineNumber).append(")");
buffer.append(log);
return buffer.toString();
}

private static void getMethodNames(StackTraceElement[] sElements){
className = sElements[1].getFileName();
methodName = sElements[1].getMethodName();
lineNumber = sElements[1].getLineNumber();
}


public static void e(String message){
if (!isDebuggable())
return;

// Throwable instance must be created before any methods
getMethodNames(new Throwable().getStackTrace());
Log.e(className, createLog(message));
}


public static void i(String message){
if (!isDebuggable())
return;

getMethodNames(new Throwable().getStackTrace());
Log.i(className, createLog(message));
}

public static void d(String message){
if (!isDebuggable())
return;

getMethodNames(new Throwable().getStackTrace());
Log.d(className, createLog(message));
}

public static void v(String message){
if (!isDebuggable())
return;

getMethodNames(new Throwable().getStackTrace());
Log.v(className, createLog(message));
}

public static void w(String message){
if (!isDebuggable())
return;

getMethodNames(new Throwable().getStackTrace());
Log.w(className, createLog(message));
}

public static void wtf(String message){
if (!isDebuggable())
return;

getMethodNames(new Throwable().getStackTrace());
Log.wtf(className, createLog(message));
}

}

来自:http://yuxingxin.com/2015/10/26/AndroidLog/