记不清在那个项目里拔下来的了 总是是个不错的log输出工具 可以直接定位到log类和行数 /** * 打印LOG,用于调试,可直接定位到行数 * * Created by android_ls on 16/9/20. */public class MLog { priva
/**
* 打印LOG,用于调试,可直接定位到行数
*
* Created by android_ls on 16/9/20.
*/
public class MLog {
private static final String DEFAULT_MESSAGE = "execute";
private static final String PARAM = "Param";
private static final String NULL = "null";
private static final String TAG_DEFAULT = "MLog";
private static final String SUFFIX = ".java";
private static final int STACK_TRACE_INDEX = 5;
private static String mGlobalTag;
private static boolean IS_SHOW_LOG = true;
public static void init(boolean isShowLog, String tag) {
IS_SHOW_LOG = isShowLog;
mGlobalTag = tag;
}
public static void v() {
printLog(Log.VERBOSE, null, DEFAULT_MESSAGE);
}
public static void v(Object msg) {
printLog(Log.VERBOSE, null, msg);
}
public static void v(String tag, Object... objects) {
printLog(Log.VERBOSE, tag, objects);
}
public static void d() {
printLog(Log.DEBUG, null, DEFAULT_MESSAGE);
}
public static void d(Object msg) {
printLog(Log.DEBUG, null, msg);
}
public static void d(String tag, Object... objects) {
printLog(Log.DEBUG, tag, objects);
}
public static void i() {
printLog(Log.INFO, null, DEFAULT_MESSAGE);
}
public static void i(Object msg) {
printLog(Log.INFO, null, msg);
}
public static void i(String tag, Object... objects) {
printLog(Log.INFO, tag, objects);
}
public static void w() {
printLog(Log.WARN, null, DEFAULT_MESSAGE);
}
public static void w(Object msg) {
printLog(Log.WARN, null, msg);
}
public static void w(String tag, Object... objects) {
printLog(Log.WARN, tag, objects);
}
public static void e() {
printLog(Log.ERROR, null, DEFAULT_MESSAGE);
}
public static void e(Object msg) {
printLog(Log.ERROR, null, msg);
}
public static void e(String tag, Object... objects) {
printLog(Log.ERROR, tag, objects);
}
private static void printLog(int type, String tagStr, Object... objects) {
if (!IS_SHOW_LOG) {
return;
}
String[] contents = wrapperContent(tagStr, objects);
String tag = contents[0];
String msg = contents[1];
String headString = contents[2];
printDefault(type, tag, headString + "\n" + msg);
}
private static String[] wrapperContent(String tagStr, Object... objects) {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement targetElement = stackTrace[STACK_TRACE_INDEX];
String className = targetElement.getClassName();
String[] classNameInfo = className.split("\\.");
if (classNameInfo.length > 0) {
className = classNameInfo[classNameInfo.length - 1] + SUFFIX;
}
if (className.contains("$")) {
className = className.split("\\$")[0] + SUFFIX;
}
String methodName = targetElement.getMethodName();
int lineNumber = targetElement.getLineNumber();
if (lineNumber < 0) {
lineNumber = 0;
}
String methodNameShort = methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
/**
* 支持全局TAG和局部TAG混搭
*
* 示例:
* KLog.i("使用全局的TAG");
KLog.i("Test", "使用局部的TAG");
执行结果:
I/BoloLog: [ (Method.java:0)#Invoke ] 使用全局的TAG
I/Test: [ (Method.java:0)#Invoke ] 使用局部的TAG
**/
String tag = tagStr;
if (TextUtils.isEmpty(tag)) {
if (!TextUtils.isEmpty(mGlobalTag)) {
tag = mGlobalTag;
} else {
tag = TAG_DEFAULT;
}
}
String msg = getObjectsString(objects);
String headString = "[ (" + className + ":" + lineNumber + ")-->" + methodNameShort + " ] ";
return new String[]{tag, msg, headString};
}
private static String getObjectsString(Object... objects) {
if (objects.length > 1) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("\n");
for (int i = 0; i < objects.length; i++) {
Object object = objects[i];
if (object == null) {
stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(NULL).append("\n");
} else {
stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(object.toString()).append("\n");
}
}
return stringBuilder.toString();
} else {
Object object = objects[0];
return object == null ? NULL : object.toString();
}
}
public static void printDefault(int type, String tag, String msg) {
int index = 0;
int maxLength = 4000;
int countOfSub = msg.length() / maxLength;
if (countOfSub > 0) {
for (int i = 0; i < countOfSub; i++) {
String sub = msg.substring(index, index + maxLength);
printSub(type, tag, sub);
index += maxLength;
}
printSub(type, tag, msg.substring(index, msg.length()));
} else {
printSub(type, tag, msg);
}
}
private static void printSub(int type, String tag, String sub) {
switch (type) {
case Log.VERBOSE:
Log.v(tag, sub);
break;
case Log.DEBUG:
Log.d(tag, sub);
break;
case Log.INFO:
Log.i(tag, sub);
break;
case Log.WARN:
Log.w(tag, sub);
break;
case Log.ERROR:
Log.e(tag, sub);
break;
}
}
}
