|
@@ -0,0 +1,309 @@
|
|
|
+package com.benyanyi.loglib;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.io.StringWriter;
|
|
|
+
|
|
|
+public final class Jlog {
|
|
|
+ static final String LINE_SEPARATOR = System.getProperty("line.separator");
|
|
|
+ static final String NULL_TIPS = "Log with null object";
|
|
|
+
|
|
|
+ private static final String DEFAULT_MESSAGE = "********";
|
|
|
+ private static final String PARAM = "Param";
|
|
|
+ private static final String NULL = "null";
|
|
|
+ private static final String TAG_DEFAULT = "Jlog";
|
|
|
+ private static String SUFFIX = ".java";
|
|
|
+
|
|
|
+ static final int JSON_INDENT = 4;
|
|
|
+
|
|
|
+ static final int D = 0x1;
|
|
|
+ static final int I = 0x2;
|
|
|
+ static final int W = 0x3;
|
|
|
+ static final int E = 0x4;
|
|
|
+ static final int F = 0x5;
|
|
|
+
|
|
|
+ private static final int JSON = 0x7;
|
|
|
+ private static final int XML = 0x8;
|
|
|
+
|
|
|
+ private static final int STACK_TRACE_INDEX_5 = 5;
|
|
|
+ private static final int STACK_TRACE_INDEX_4 = 4;
|
|
|
+
|
|
|
+ private static String mGlobalTag;
|
|
|
+ private static boolean mIsGlobalTagEmpty = true;
|
|
|
+ private static boolean IS_SHOW_LOG = true;
|
|
|
+ private static boolean IS_INIT = false;
|
|
|
+
|
|
|
+ public static void init(boolean isShowLog) {
|
|
|
+ IS_SHOW_LOG = isShowLog;
|
|
|
+ IS_INIT = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void init(boolean isShowLog, String tag) {
|
|
|
+ IS_SHOW_LOG = isShowLog;
|
|
|
+ mGlobalTag = tag;
|
|
|
+ mIsGlobalTagEmpty = TextUtils.isEmpty(mGlobalTag);
|
|
|
+ IS_INIT = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void f() {
|
|
|
+ printLog(F, null, DEFAULT_MESSAGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void f(Object msg) {
|
|
|
+ printLog(F, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void f(Object tag, Object... objects) {
|
|
|
+ printLog(F, tag, objects);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void d() {
|
|
|
+ printLog(D, null, DEFAULT_MESSAGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void d(Object msg) {
|
|
|
+ printLog(D, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void d(Object tag, Object... objects) {
|
|
|
+ printLog(D, tag, objects);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void i() {
|
|
|
+ printLog(I, null, DEFAULT_MESSAGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void i(Object msg) {
|
|
|
+ printLog(I, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void i(Object tag, Object... objects) {
|
|
|
+ printLog(I, tag, objects);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void w() {
|
|
|
+ printLog(W, null, DEFAULT_MESSAGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void w(Object msg) {
|
|
|
+ printLog(W, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void w(Object tag, Object... objects) {
|
|
|
+ printLog(W, tag, objects);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void e() {
|
|
|
+ printLog(E, null, DEFAULT_MESSAGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void e(Object msg) {
|
|
|
+ printLog(E, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void e(Object tag, Object... objects) {
|
|
|
+ printLog(E, tag, objects);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void json(Object jsonFormat) {
|
|
|
+ printLog(JSON, null, jsonFormat);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void json(Object tag, String jsonFormat) {
|
|
|
+ printLog(JSON, tag, jsonFormat);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void xml(Object xml) {
|
|
|
+ printLog(XML, null, xml);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void xml(Object tag, String xml) {
|
|
|
+ printLog(XML, tag, xml);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void file(File targetDirectory, Object msg) {
|
|
|
+ printFile(null, targetDirectory, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void file(Object tag, File targetDirectory, Object msg) {
|
|
|
+ printFile(tag, targetDirectory, null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void file(Object tag, File targetDirectory, String fileName, Object msg) {
|
|
|
+ printFile(tag, targetDirectory, fileName, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void debug() {
|
|
|
+ printDebug(null, DEFAULT_MESSAGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void debug(Object msg) {
|
|
|
+ printDebug(null, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void debug(Object tag, Object... objects) {
|
|
|
+ printDebug(tag, objects);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void trace() {
|
|
|
+ printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void printStackTrace() {
|
|
|
+
|
|
|
+ if (!IS_SHOW_LOG) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!IS_INIT && isApkInDebug()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Throwable tr = new Throwable();
|
|
|
+ StringWriter sw = new StringWriter();
|
|
|
+ PrintWriter pw = new PrintWriter(sw);
|
|
|
+ tr.printStackTrace(pw);
|
|
|
+ pw.flush();
|
|
|
+ String message = sw.toString();
|
|
|
+
|
|
|
+ String[] traceString = message.split("\\n\\t");
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ sb.append("\n");
|
|
|
+ for (String trace : traceString) {
|
|
|
+ if (trace.contains("at Jlog")) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ sb.append(trace).append("\n");
|
|
|
+ }
|
|
|
+ String[] contents = wrapperContent(STACK_TRACE_INDEX_4, null, sb.toString());
|
|
|
+ String tag = contents[0];
|
|
|
+ String msg = contents[1];
|
|
|
+ String headString = contents[2];
|
|
|
+ BaseLog.printDefault(D, tag, headString + msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void printLog(int type, Object tagStr, Object... objects) {
|
|
|
+
|
|
|
+ if (!IS_SHOW_LOG) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!IS_INIT && isApkInDebug()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objects);
|
|
|
+ String tag = contents[0];
|
|
|
+ String msg = contents[1];
|
|
|
+ String headString = contents[2];
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ default:
|
|
|
+ case D:
|
|
|
+ case I:
|
|
|
+ case W:
|
|
|
+ case E:
|
|
|
+ case F:
|
|
|
+ BaseLog.printDefault(type, tag, headString + msg);
|
|
|
+ break;
|
|
|
+ case JSON:
|
|
|
+ JsonLog.printJson(tag, msg, headString);
|
|
|
+ break;
|
|
|
+ case XML:
|
|
|
+// XmlLog.printXml(tag, msg, headString);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void printDebug(Object tagStr, Object... objects) {
|
|
|
+ String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objects);
|
|
|
+ String tag = contents[0];
|
|
|
+ String msg = contents[1];
|
|
|
+ String headString = contents[2];
|
|
|
+ BaseLog.printDefault(D, tag, headString + msg);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private static void printFile(Object tagStr, File targetDirectory, String fileName, Object objectMsg) {
|
|
|
+
|
|
|
+ if (!IS_SHOW_LOG) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!IS_INIT && isApkInDebug()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objectMsg);
|
|
|
+ String tag = contents[0];
|
|
|
+ String msg = contents[1];
|
|
|
+ String headString = contents[2];
|
|
|
+
|
|
|
+// FileLog.printFile(tag, targetDirectory, fileName, headString, msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String[] wrapperContent(int stackTraceIndex, Object tagStr, Object... objects) {
|
|
|
+
|
|
|
+ SUFFIX = ".java";
|
|
|
+
|
|
|
+ StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
|
|
+
|
|
|
+ StackTraceElement targetElement = stackTrace[stackTraceIndex];
|
|
|
+ String className = targetElement.getClassName();
|
|
|
+ String[] classNameInfo = className.split("\\.");
|
|
|
+ if (classNameInfo.length > 0) {
|
|
|
+ className = classNameInfo[classNameInfo.length - 1] + SUFFIX;
|
|
|
+ }
|
|
|
+ String str = "$";
|
|
|
+ if (className.contains(str)) {
|
|
|
+ className = className.split("\\$")[0] + SUFFIX;
|
|
|
+ }
|
|
|
+
|
|
|
+ String methodName = targetElement.getMethodName();
|
|
|
+ int lineNumber = targetElement.getLineNumber();
|
|
|
+
|
|
|
+ if (lineNumber < 0) {
|
|
|
+ lineNumber = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ String tag = (tagStr == null ? className : tagStr).toString();
|
|
|
+
|
|
|
+ if (mIsGlobalTagEmpty && TextUtils.isEmpty(tag)) {
|
|
|
+ tag = TAG_DEFAULT;
|
|
|
+ } else if (!mIsGlobalTagEmpty) {
|
|
|
+ tag = mGlobalTag;
|
|
|
+ }
|
|
|
+
|
|
|
+ String msg = (objects == null) ? NULL_TIPS : getObjectsString(objects);
|
|
|
+ String headString = "[ (" + className + ":" + lineNumber + ")#" + methodName + " ] ";
|
|
|
+
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static boolean isApkInDebug() {
|
|
|
+// try {
|
|
|
+// @SuppressLint("PrivateApi")
|
|
|
+// Application application = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null, (Object[]) null);
|
|
|
+// ApplicationInfo info = application.getApplicationInfo();
|
|
|
+// return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0;
|
|
|
+// } catch (Exception e) {
|
|
|
+ return false;
|
|
|
+// }
|
|
|
+ }
|
|
|
+}
|