系统的log日记能看出不少信息,但是系统自带log并不是那么好用。比如说你不调试想关掉调试,你要一条条删除,调试时候log信息在第几行也不好看出。既然如此为什么不自己制作一个能实现自己需要的log系统呢?接下来将要实现的是带TargetStackTraceElement的log工具类,制作自己个性化的log日记系统。
下面是logUtil代码:
import android.util.Log;
public class LogUtil {
public static void v(String tag, String msg) {
if (!Const.isVerbose)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.v(tag, getTAG(targetStackTraceElement));
Log.v(tag, msg);
}
public static void v(String tag, String msg, Throwable tr) {
if (!Const.isVerbose)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.v(tag, getTAG(targetStackTraceElement));
Log.v(tag, msg, tr);
}
public static void d(String tag, String msg) {
if (!Const.isDebug)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.d(tag, getTAG(targetStackTraceElement));
Log.d(tag, msg);
}
public static void d(String tag, String msg, Throwable tr) {
if (!Const.isDebug)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.d(tag, getTAG(targetStackTraceElement));
Log.d(tag, msg, tr);
}
public static void i(String tag, String msg) {
if (!Const.isInformation)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.i(tag, getTAG(targetStackTraceElement));
Log.i(tag, msg);
}
public static void i(String tag, String msg, Throwable tr) {
if (!Const.isInformation)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.i(tag, getTAG(targetStackTraceElement));
Log.i(tag, msg, tr);
}
public static void w(String tag, String msg) {
if (!Const.isWarning)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.w(tag, getTAG(targetStackTraceElement));
Log.w(tag, msg);
}
public static void w(String tag, String msg, Throwable tr) {
if (!Const.isWarning)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.w(tag, getTAG(targetStackTraceElement));
Log.w(tag, msg, tr);
}
public static void e(String tag, String msg) {
if (!Const.isError)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.e(tag, getTAG(targetStackTraceElement));
Log.e(tag, msg);
}
public static void e(String tag, String msg, Throwable tr) {
if (!Const.isError)
return;
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.e(tag, getTAG(targetStackTraceElement));
Log.e(tag, msg, tr);
}
private static String getTAG(StackTraceElement targetStackTraceElement) {
return targetStackTraceElement.getClassName() + "." + targetStackTraceElement.getMethodName() + "("
+ targetStackTraceElement.getFileName() + ":" + targetStackTraceElement.getLineNumber() + ")";
}
private static StackTraceElement getTargetStackTraceElement() {
StackTraceElement targetStackTrace = null;
boolean shouldTrace = false;
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
boolean isLogMethod = stackTraceElement.getClassName().equals(LogUtil.class.getName());
if (shouldTrace && !isLogMethod) {
targetStackTrace = stackTraceElement;
break;
}
shouldTrace = isLogMethod;
}
return targetStackTrace;
}
}
这里面的TargetStackTraceElement是要实现显示代码行,包名字,文件名等。在另外一个Const类里面实现开关调试功能。
public class Const {
//LogUtil
public static boolean isDebug = true; //Debug调试
public static boolean isVerbose = true; //任何消息
public static boolean isInformation = true; //提示性的消息
public static boolean isWarning = true; //警告信息
public static boolean isError = true; //错误信息
}
代码调用:
LogUtil.d("info", "1234567");
显示效果如下:
info com.example.Reader.Date(Reader.java:207)
info 1234567
当然了,如果你对这个显示效果不满意,也可以根据自己需要改写。