我们在Android开发中,经常使用添加log的方法,通过分析log来判断代码的执行情况。但是,每个人都有自己的log,不删除的话代码显得特别low,但也不能操作别人添加的log,这样代码执行过程中,就不断的有LOG的输出,这是一个很繁琐的问题。网上查看了一下,很多大神现在都已经不适用Android源生的LOG了,而是对源生的LOG进行了封装。通过设置log的开关,设置是否输出LOG,然后每个人可以创建自己的LOG类。详细,请看代码:
LogUtil.java
/**
* Created by vectoria on 2017/6/27.
* Log打印的封装
* 使用方法:
* 可以自定义自己的log.tag
*/
public class LogUtil{
private static final boolean DEBUG = true;
public static final String CONSTANTS_VECTORIA = "vectoria";
public static void D(String tag,String logMsg){
if(DEBUG){
LogBase.d(tag,logMsg);
}
}
public static void d(String tag, String desc) {
if (DEBUG)
LogBase.d(tag, desc);
}
public static void v(String tag, String desc) {
if (DEBUG)
LogBase.v(tag, desc);
}
public static void w(String tag, String desc) {
if (DEBUG)
LogBase.w(tag, desc);
}
public static void i(String tag, String desc) {
if (DEBUG)
LogBase.i(tag, desc);
}
public static void e(String tag, String desc) {
if (DEBUG)
LogBase.e(tag, desc);
}
}
LogBase.java
/**
* Created by vectoria on 2017/7/17.
*/
public class LogBase {
public static final int VERBOSE = 1;
public static final int DEBUG = 2;
public static final int INFO = 3;
public static final int WARN = 4;
public static final int ERROR = 5;
public static final int NOTHING = 6;
public static final int LEVEL = VERBOSE;
public static final String SEPARATOR = ",";
public static void v(String message) {
if (LEVEL <= VERBOSE) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
String tag = getDefaultTag(stackTraceElement);
Log.v(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void v(String tag, String message) {
if (LEVEL <= VERBOSE) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
if (TextUtils.isEmpty(tag)) {
tag = getDefaultTag(stackTraceElement);
}
Log.v(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void d(String message) {
if (LEVEL <= DEBUG) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
String tag = getDefaultTag(stackTraceElement);
Log.d(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void d(String tag, String message) {
if (LEVEL <= DEBUG) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
if (TextUtils.isEmpty(tag)) {
tag = getDefaultTag(stackTraceElement);
}
Log.d(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void i(String message) {
if (LEVEL <= INFO) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
String tag = getDefaultTag(stackTraceElement);
Log.i(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void i(String tag, String message) {
if (LEVEL <= INFO) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
if (TextUtils.isEmpty(tag)) {
tag = getDefaultTag(stackTraceElement);
}
Log.i(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void w(String message) {
if (LEVEL <= WARN) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
String tag = getDefaultTag(stackTraceElement);
Log.w(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void w(String tag, String message) {
if (LEVEL <= WARN) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
if (TextUtils.isEmpty(tag)) {
tag = getDefaultTag(stackTraceElement);
}
Log.w(tag, getLogInfo(stackTraceElement) + message);
}
}
public static void e(String tag, String message) {
if (LEVEL <= ERROR) {
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
if (TextUtils.isEmpty(tag)) {
tag = getDefaultTag(stackTraceElement);
}
Log.e(tag, getLogInfo(stackTraceElement) + message);
}
}
/**
* 获取默认的TAG名称.
* 比如在MainActivity.java中调用了日志输出.
* 则TAG为MainActivity
*/
public static String getDefaultTag(StackTraceElement stackTraceElement) {
String fileName = stackTraceElement.getFileName();
String stringArray[] = fileName.split("\\.");
String tag = stringArray[0];
return tag;
}
/**
* 输出日志所包含的信息
* 线程ID
* 类名
* 方法名
* 行数
* log
*/
public static String getLogInfo(StackTraceElement stackTraceElement) {
StringBuilder logInfoStringBuilder = new StringBuilder();
// 获取线程名
String threadName = Thread.currentThread().getName();
// 获取线程ID
long threadID = Thread.currentThread().getId();
// 获取文件名.即xxx.java
String fileName = stackTraceElement.getFileName();
// 获取类名.即包名+类名
String className = stackTraceElement.getClassName();
// 获取方法名称
String methodName = stackTraceElement.getMethodName();
// 获取生日输出行数
int lineNumber = stackTraceElement.getLineNumber();
logInfoStringBuilder.append("[ ");
logInfoStringBuilder.append("threadID=" + threadID).append(SEPARATOR);
logInfoStringBuilder.append("className=" + className).append(SEPARATOR);
logInfoStringBuilder.append("methodName=" + methodName).append(SEPARATOR);
logInfoStringBuilder.append("lineNumber=" + lineNumber);
logInfoStringBuilder.append(" ] ");
return logInfoStringBuilder.toString();
}
}
然后你就使用VLogUtil.d(tag,msg)方法调用就好了。
如果你觉得你的代码写的有点low,不妨试试这种装逼的方法,确实有用~