LogUtil.java package com.aotom.dvr.utils;import android.text.TextUtils;import android.util.Log;/** * * @author ckb58 */@SuppressWarnings({"DefaultFileTemplate", "JavaDoc", "unused"})public class LogUtil { /** * 用来记录 VERBOSE 类型的日
package com.aotom.dvr.utils;
import android.text.TextUtils;
import android.util.Log;
/**
*
* @author ckb58
*/
@SuppressWarnings({"DefaultFileTemplate", "JavaDoc", "unused"})
public class LogUtil {
/**
* 用来记录 VERBOSE 类型的日志
*/
private static final int VERBOSE = 1;
/**
* 用来记录 DEBUG 类型的日志
*/
private static final int DEBUG = 2;
/**
* 用来记录 INFO 类型的日志
*/
private static final int INFO = 3;
/**
* 用来记录 WARN 类型的日志
*/
private static final int WARN = 4;
/**
* 用来记录 ERROR 类型的日志
*/
private static final int ERROR = 5;
/**
* 用来记录 ASSERT 类型的日志
*/
private static final int ASSERT = 6;
/**
* 是否打印日志
*/
public static boolean isPrint = true;
/**
* 自定义 TAG 的前缀
*/
public static String customTagPrefix = "";
private LogUtil() {
//不能实例化的的异常
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* VERBOSE 类型的日志
*
* @param msg 内容
*/
public static void v(String msg) {
print(VERBOSE, msg, null);
}
/**
* VERBOSE 类型的日志
*
* @param msg 内容
* @param tr 异常
*/
public static void v(String msg, Throwable tr) {
print(VERBOSE, msg, tr);
}
/**
* DEBUG 类型的日志
*
* @param msg 内容
*/
public static void d(String msg) {
print(DEBUG, msg, null);
}
/**
* DEBUG 类型的日志
*
* @param msg 内容
* @param tr 异常
*/
public static void d(String msg, Throwable tr) {
print(DEBUG, msg, tr);
}
/**
* INFO 类型的日志
*
* @param msg 内容
*/
public static void i(String msg) {
print(INFO, msg, null);
}
/**
* INFO 类型的日志
*
* @param msg 内容
* @param tr 异常
*/
public static void i(String msg, Throwable tr) {
print(INFO, msg, tr);
}
/**
* WARN 类型的日志
*
* @param msg 内容
*/
public static void w(String msg) {
print(WARN, msg, null);
}
/**
* WARN 类型的日志
*
* @param tr 异常
*/
public static void w(Throwable tr) {
print(WARN, null, tr);
}
/**
* WARN 类型的日志
*
* @param msg 内容
* @param tr 异常
*/
public static void w(String msg, Throwable tr) {
print(WARN, msg, tr);
}
/**
* ERROR 类型的日志
*
* @param msg 内容
*/
public static void e(String msg) {
print(ERROR, msg, null);
}
/**
* ERROR 类型的日志
*
* @param msg 内容
* @param tr 异常
*/
public static void e(String msg, Throwable tr) {
print(ERROR, msg, tr);
}
/**
* ASSERT 类型的日志
*
* @param msg 内容
*/
public static void wtf(String msg) {
print(ASSERT, msg, null);
}
/**
* ASSERT 类型的日志
*
* @param tr 异常
*/
public static void wtf(Throwable tr) {
print(ASSERT, null, tr);
}
/**
* ASSERT 类型的日志
*
* @param msg 内容
* @param tr 异常
*/
public static void wtf(String msg, Throwable tr) {
print(ASSERT, msg, tr);
}
/**
* 获取 StackTraceElement
*
* @return
*/
private static StackTraceElement getStackTraceElement() {
boolean isStackTraceElement = false;
StackTraceElement stackTraceElement = null;
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement ste : stackTraceElements) {
boolean isClassName = ste.getClassName().equals(LogUtil.class.getName());
if (isStackTraceElement && !isClassName) {
stackTraceElement = ste;
break;
}
isStackTraceElement = isClassName;
}
return stackTraceElement;
}
/**
* 根据 StackTraceElement 获取相关的包名、类名,并设置 TAG
*
* @param stackTraceElement StackTraceElement
* @return
*/
private static String generateTag(StackTraceElement stackTraceElement) {
//获取包名和类名
String className = stackTraceElement.getClassName();
//截取类名
className = className.substring(className.lastIndexOf(".") + 1);
//自定义 TAG 的前缀拼接类名
String customTagPrefixClassName = customTagPrefix + "[" + className + "]";
return TextUtils.isEmpty(customTagPrefix) ? className : customTagPrefixClassName;
}
/**
* 根据 StackTraceElement 获取相关的文件名、包名、类名、方法名、行号,并设置 msg
*
* @param stackTraceElement StackTraceElement
* @return
*/
private static String generateMsg(StackTraceElement stackTraceElement) {
//获取文件名
String fileName = stackTraceElement.getFileName();
//获取包名和类名
String className = stackTraceElement.getClassName();
//获取方法名
String methodName = stackTraceElement.getMethodName();
//获取行号
int lineNumber = stackTraceElement.getLineNumber();
//可点击跳转的标准 msg 拼接格式
String msg = "at " + className + "." + methodName + "(" + fileName + ":" + lineNumber + ")";
//拼接线程名和 msg 为新的 msg(追加4个空格保持对齐)
msg = msg + "\r\n" + "ThreadName:" + Thread.currentThread().getName() + "\r\n";
return msg;
}
/**
* 打印 Log
*
* @param level Log 的等级
* @param content Log 的内容
* @param tr Log 的异常
*/
private static void print(int level, String content, Throwable tr) {
if (isPrint) {
String tag = generateTag(getStackTraceElement());
String msg = generateMsg(getStackTraceElement()) + content;
switch (level) {
case VERBOSE:
if (tr == null) {
Log.v(tag, msg);
} else {
Log.v(tag, msg, tr);
}
break;
case DEBUG:
if (tr == null) {
Log.d(tag, msg);
} else {
Log.d(tag, msg, tr);
}
break;
case INFO:
if (tr == null) {
Log.i(tag, msg);
} else {
Log.i(tag, msg, tr);
}
break;
case WARN:
if (tr == null) {
Log.w(tag, msg);
} else if (content == null) {
Log.w(tag, tr);
} else {
Log.w(tag, msg, tr);
}
break;
case ERROR:
if (tr == null) {
Log.e(tag, msg);
} else {
Log.e(tag, msg, tr);
}
break;
case ASSERT:
if (tr == null) {
Log.wtf(tag, msg);
} else if (content == null) {
Log.wtf(tag, tr);
} else {
Log.wtf(tag, msg, tr);
}
break;
default:
break;
}
}
}
}
