package com.socks.library; import android.text.TextUtils; import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; /** * This is a Log tool,with this you can the following *
    *
  1. use KLog.d(),you could print whether the method execute,and the default tag is current class's name
  2. *
  3. use KLog.d(msg),you could print log as before,and you could location the method with a click in Android Studio Logcat
  4. *
  5. use KLog.json(),you could print json string with well format automatic
  6. *
* * @author zhaokaiqiang * github https://github.com/ZhaoKaiQiang/KLog * 15/11/17 扩展功能,添加对文件的支持 */ public class KLog { private static boolean IS_SHOW_LOG = true; private static final String DEFAULT_MESSAGE = "execute"; private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private static final String NULL_TIPS = "Log with null object"; private static final int JSON_INDENT = 4; private static final int V = 0x1; private static final int D = 0x2; private static final int I = 0x3; private static final int W = 0x4; private static final int E = 0x5; private static final int A = 0x6; private static final int JSON = 0x7; public static void init(boolean isShowLog) { IS_SHOW_LOG = isShowLog; } public static void v() { printLog(V, null, DEFAULT_MESSAGE); } public static void v(Object msg) { printLog(V, null, msg); } public static void v(String tag, String msg) { printLog(V, tag, msg); } public static void d() { printLog(D, null, DEFAULT_MESSAGE); } public static void d(Object msg) { printLog(D, null, msg); } public static void d(String tag, Object msg) { printLog(D, tag, msg); } public static void i() { printLog(I, null, DEFAULT_MESSAGE); } public static void i(Object msg) { printLog(I, null, msg); } public static void i(String tag, Object msg) { printLog(I, tag, msg); } public static void w() { printLog(W, null, DEFAULT_MESSAGE); } public static void w(Object msg) { printLog(W, null, msg); } public static void w(String tag, Object msg) { printLog(W, tag, msg); } public static void e() { printLog(E, null, DEFAULT_MESSAGE); } public static void e(Object msg) { printLog(E, null, msg); } public static void e(String tag, Object msg) { printLog(E, tag, msg); } public static void a() { printLog(A, null, DEFAULT_MESSAGE); } public static void a(Object msg) { printLog(A, null, msg); } public static void a(String tag, Object msg) { printLog(A, tag, msg); } public static void json(String jsonFormat) { printLog(JSON, null, jsonFormat); } public static void json(String tag, String jsonFormat) { printLog(JSON, tag, jsonFormat); } public static void xml(String xml) { printXml(null, xml); } public static void xml(String tag, String xml) { printXml(tag, xml); } public static void file(File targetDirectory, Object msg) { printFile(null, targetDirectory, null, msg); } public static void file(String tag, File targetDirectory, Object msg) { printFile(tag, targetDirectory, null, msg); } public static void file(String tag, File targetDirectory, String fileName, Object msg) { printFile(tag, targetDirectory, fileName, msg); } private static void printLog(int type, String tagStr, Object objectMsg) { if (!IS_SHOW_LOG) { return; } StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); int index = 4; String className = stackTrace[index].getFileName(); String methodName = stackTrace[index].getMethodName(); int lineNumber = stackTrace[index].getLineNumber(); String methodNameShort = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("[ (").append(className).append(":").append(lineNumber).append(")#").append(methodNameShort).append(" ] "); String tag = (tagStr == null ? className : tagStr); String msg = (objectMsg == null) ? NULL_TIPS : objectMsg.toString(); String headString = stringBuilder.toString(); switch (type) { case V: case D: case I: case W: case E: case A: msg = headString + msg; printDefault(type, tag, msg); break; case JSON: printJson(tag, msg, headString); break; } } private static void printDefault(int type, String tag, String msg) { switch (type) { case V: Log.v(tag, msg); break; case D: Log.d(tag, msg); break; case I: Log.i(tag, msg); break; case W: Log.w(tag, msg); break; case E: Log.e(tag, msg); break; case A: Log.wtf(tag, msg); break; } } private static void printJson(String tag, String msg, String headString) { String message; try { if (msg.startsWith("{")) { JSONObject jsonObject = new JSONObject(msg); message = jsonObject.toString(JSON_INDENT); } else if (msg.startsWith("[")) { JSONArray jsonArray = new JSONArray(msg); message = jsonArray.toString(JSON_INDENT); } else { message = msg; } } catch (JSONException e) { e(tag, e.getCause().getMessage() + "\n" + msg); return; } printLine(tag, true); message = headString + LINE_SEPARATOR + message; String[] lines = message.split(LINE_SEPARATOR); for (String line : lines) { Log.d(tag, "║ " + line); } printLine(tag, false); } private static void printFile(String tag, File targetDirectory, String fileName, Object objectMsg) { if (!IS_SHOW_LOG) { return; } StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); int index = 4; String className = stackTrace[index].getFileName(); String methodName = stackTrace[index].getMethodName(); int lineNumber = stackTrace[index].getLineNumber(); tag = (tag == null ? className : tag); String methodNameShort = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("[ (").append(className).append(":").append(lineNumber).append(")#").append(methodNameShort).append(" ] "); String msg = (objectMsg == null) ? NULL_TIPS : objectMsg.toString(); String headString = stringBuilder.toString(); if (msg != null) { msg = headString + msg; } fileName = (fileName == null) ? FileHelper.getFileName() : fileName; if (FileHelper.save(targetDirectory, fileName, msg)) { Log.d(tag, headString + " save log success ! location is >>>" + targetDirectory.getAbsolutePath() + "/" + fileName); } else { Log.e(tag, headString + "save log fails !"); } } private static void printXml(String tag, String xml) { if (!IS_SHOW_LOG) { return; } StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); int index = 4; String className = stackTrace[index].getFileName(); String methodName = stackTrace[index].getMethodName(); int lineNumber = stackTrace[index].getLineNumber(); tag = (tag == null ? className : tag); String methodNameShort = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("[ (").append(className).append(":").append(lineNumber).append(")#").append(methodNameShort).append(" ] "); String headString = stringBuilder.toString(); if (xml != null) { xml = XmlHelper.formatXML(xml); xml = headString + "\n" + xml; } else { xml = headString + NULL_TIPS; } printLine(tag, true); String[] lines = xml.split(LINE_SEPARATOR); for (String line : lines) { if (!isEmpty(line)) { Log.d(tag, "║ " + line); } } printLine(tag, false); } private static void printLine(String tag, boolean isTop) { if (isTop) { Log.d(tag, "╔═══════════════════════════════════════════════════════════════════════════════════════"); } else { Log.d(tag, "╚═══════════════════════════════════════════════════════════════════════════════════════"); } } private static boolean isEmpty(String line) { return TextUtils.isEmpty(line) || line.equals("\n") || line.equals("\r\n") || line.equals("\t"); } }