在Android开发过程中经常用到Log,在日志打印中,我们需要频繁定义日志的TAG,并且日志内容不能输出方法名,线程ID以及行数等。于是就定义了一个基于这个需求的日志辅助类——LogUtil工具类。
自定义的LogUtil工具类如下:
package com.mylogutiltest;
import android.util.Log;
import java.util.Locale;
public class LogUtil {
private static boolean LOGV = true;
private static boolean LOGD = true;
private static boolean LOGI = true;
private static boolean LOGW = true;
private static boolean LOGE = true;
// 直接使用Log
public static void v(String tag, String mess) {
if (LOGV) { Log.v(tag, mess); }
}
public static void d(String tag, String mess) {
if (LOGD) { Log.d(tag, mess); }
}
public static void i(String tag, String mess) {
if (LOGI) { Log.i(tag, mess); }
}
public static void w(String tag, String mess) {
if (LOGW) { Log.w(tag, mess); }
}
public static void e(String tag, String mess) {
if (LOGE) { Log.e(tag, mess); }
}
/**
* 获取到调用者的类名
* @return 调用者的类名
*/
private static String getTag() {
StackTraceElement[] trace = new Throwable().fillInStackTrace()
.getStackTrace();
String callingClass = "";
for (int i = 2; i < trace.length; i++) {
Class<?> clazz = trace[i].getClass();
if (!clazz.equals(LogUtil.class)) {
callingClass = trace[i].getClassName();
callingClass = callingClass.substring(callingClass
.lastIndexOf('.') + 1);
break;
}
}
return callingClass;
}
//不需要再在类中定义TAG,直接打印日志信息
public static void v1(String mess) {
if (LOGV) { Log.v(getTag(), mess); }
}
public static void d1(String mess) {
if (LOGD) { Log.d(getTag(), mess); }
}
public static void i1(String mess) {
if (LOGI) { Log.i(getTag(), mess); }
}
public static void w1(String mess) {
if (LOGW) { Log.w(getTag(), mess); }
}
public static void e1(String mess) {
if (LOGE) { Log.e(getTag(), mess); }
}
/**
* 获取线程ID,方法名和输出信息
* @param msg
* @return
*/
private static String buildMessage(String msg) {
StackTraceElement[] trace = new Throwable().fillInStackTrace()
.getStackTrace();
String caller = "";
for (int i = 2; i < trace.length; i++) {
Class<?> clazz = trace[i].getClass();
if (!clazz.equals(LogUtil.class)) {
caller = trace[i].getMethodName();
break;
}
}
return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread()
.getId(), caller, msg);
}
//不需要再在类中定义TAG,打印线程ID,方法名和输出信息
public static void v2(String mess) {
if (LOGV) { Log.v(getTag(), buildMessage(mess)); }
}
public static void d2(String mess) {
if (LOGD) { Log.d(getTag(), buildMessage(mess)); }
}
public static void i2(String mess) {
if (LOGI) { Log.i(getTag(), buildMessage(mess)); }
}
public static void w2(String mess) {
if (LOGW) { Log.w(getTag(), buildMessage(mess)); }
}
public static void e2(String mess) {
if (LOGE) { Log.e(getTag(), buildMessage(mess)); }
}
//不需要再在类中定义TAG,打印类名,方法名,行号等.并定位行
public static void v3(String mess) {
if (LOGV) { Log.v(getTag(), getMsgFormat(mess)); }
}
public static void d3(String mess) {
if (LOGD) { Log.d(getTag(), getMsgFormat(mess)); }
}
public static void i3(String mess) {
if (LOGI) { Log.i(getTag(), getMsgFormat(mess)); }
}
public static void w3(String mess) {
if (LOGW) { Log.w(getTag(), getMsgFormat(mess)); }
}
public static void e3(String mess) {
if (LOGE) { Log.e(getTag(), getMsgFormat(mess)); }
}
/**
* 获取相关数据:类名,方法名,行号等.用来定位行
* @return
*/
private static String getFunctionName() {
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
if (sts != null) {
for (StackTraceElement st : sts) {
if (st.isNativeMethod()) {
continue;
}
if (st.getClassName().equals(Thread.class.getName())) {
continue;
}
if (st.getClassName().equals(LogUtil.class.getName())) {
continue;
}
return "[ Thread:" + Thread.currentThread().getName() + ", at " + st.getClassName() + "." + st.getMethodName()
+ "(" + st.getFileName() + ":" + st.getLineNumber() + ")" + " ]";
}
}
return null;
}
/**
* 输出格式定义
* @param msg
* @return
*/
private static String getMsgFormat(String msg) {
return msg + " ;" + getFunctionName();
}
}
MainActivity.java文件 :
package com.mylogutiltest;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 直接使用Log
LogUtil.d(TAG, "ddddddd");
LogUtil.e(TAG, "eeeeeee");
LogUtil.i(TAG ,"iiiiiii");
LogUtil.v(TAG, "vvvvvvv");
LogUtil.w(TAG, "wwwwwww");
//不需要再在类中定义TAG,直接打印日志信息
LogUtil.d1("ddddddd");
LogUtil.e1("eeeeeee");
LogUtil.i1("iiiiiii");
LogUtil.v1("vvvvvvv");
LogUtil.w1("wwwwwww");
//不需要再在类中定义TAG,打印线程ID,方法名和输出信息
LogUtil.d2("ddddddd");
LogUtil.e2("eeeeeee");
LogUtil.i2("iiiiiii");
LogUtil.v2("vvvvvvv");
LogUtil.w2("wwwwwww");
//不需要再在类中定义TAG,打印类名,方法名,行号等.并定位行
LogUtil.d3("ddddddd");
LogUtil.e3("eeeeeee");
LogUtil.i3("iiiiiii");
LogUtil.v3("vvvvvvv");
LogUtil.w3("wwwwwww");
}
}
结果打印:
11-07 09:48:27.703 22447-22447/com.mylogutiltest D/MainActivity: ddddddd
11-07 09:48:27.703 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee
11-07 09:48:27.703 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii
11-07 09:48:27.703 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv
11-07 09:48:27.703 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww
11-07 09:48:27.703 22447-22447/com.mylogutiltest D/MainActivity: ddddddd
11-07 09:48:27.703 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee
11-07 09:48:27.703 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii
11-07 09:48:27.703 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv
11-07 09:48:27.703 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww
11-07 09:48:27.713 22447-22447/com.mylogutiltest D/MainActivity: [1] onCreate: ddddddd
11-07 09:48:27.713 22447-22447/com.mylogutiltest E/MainActivity: [1] onCreate: eeeeeee
11-07 09:48:27.733 22447-22447/com.mylogutiltest I/MainActivity: [1] onCreate: iiiiiii
11-07 09:48:27.733 22447-22447/com.mylogutiltest V/MainActivity: [1] onCreate: vvvvvvv
11-07 09:48:27.733 22447-22447/com.mylogutiltest W/MainActivity: [1] onCreate: wwwwwww
11-07 09:48:27.733 22447-22447/com.mylogutiltest D/MainActivity: ddddddd ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:35) ]
11-07 09:48:27.733 22447-22447/com.mylogutiltest E/MainActivity: eeeeeee ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:36) ]
11-07 09:48:27.733 22447-22447/com.mylogutiltest I/MainActivity: iiiiiii ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:37) ]
11-07 09:48:27.733 22447-22447/com.mylogutiltest V/MainActivity: vvvvvvv ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:38) ]
11-07 09:48:27.743 22447-22447/com.mylogutiltest W/MainActivity: wwwwwww ;[ Thread:main, at com.mylogutiltest.MainActivity.onCreate(MainActivity.java:39) ]