1.原始版
public class MyLogger {
private final String TAG = "你的应用程序名";//使用时换做自己的application名
//private boolean isDebug = android.os.Build.TYPE.startsWith("user") ? Log.isLoggable(TAG, Log.DEBUG) : true;
private boolean isDebug = true;
private String mClassName;
public MyLogger(String name) {
mClassName = name;
}
public void v(String log) {
if (isDebug) {
Log.v(TAG, "[" + mClassName + "]:" + log);
}
}
public void d(String log) {
if (isDebug) {
Log.d(TAG, "[" + mClassName + "]:" + log);
}
}
public void i(String log) {
if (isDebug) {
Log.i(TAG, "[" + mClassName + "]:" + log);
}
}
public void i(String log, Throwable tr) {
if (isDebug) {
Log.i(TAG, "[" + mClassName + "]:" + log + "\n"
+ Log.getStackTraceString(tr));
}
}
public void w(String log) {
if (isDebug) {
Log.w(TAG, "[" + mClassName + "]:" + log);
}
}
public void w(String log, Throwable tr) {
if (isDebug) {
Log.w(TAG, "[" + mClassName + "]:" + log + "\n"
+ Log.getStackTraceString(tr));
}
}
public void e(String log) {
if (isDebug) {
Log.e(TAG, "[" + mClassName + "]:" + log);
}
}
public void e(String log, Throwable tr) {
if (isDebug) {
Log.e(TAG, "[" + mClassName + "]:" + log + "\n"
+ Log.getStackTraceString(tr));
}
}
}
使用方法:
|作为每个类的成员变量,实例化是传入该类的类名,如:MainActivity
public final MyLogger LOG = new MyLogger(“MainActivity”);
LOG.i(“onCreate”);直接在需要处使用即可。
|release时将isDebug的值改为false,就可以不再打印log。
2.改进版
public class MyLogger {
private final String TAG = "你的应用程序名";//使用时换做自己的application名
//private boolean isDebug = android.os.Build.TYPE.startsWith("user") ? Log.isLoggable(TAG, Log.DEBUG) : true;
private boolean isDebug = true;
private String mClassName;
public int curLogLevel = Log.VERBOSE;//当前需要打印的log等级
public MyLogger(String name) {
mClassName = name;
}
public void v(String log) {
if (curLogLevel > Log.VERBOSE) {
return;
}
if (isDebug) {
Log.v(TAG, "[" + mClassName + "]:" + log);
}
}
public void d(String log) {
if (curLogLevel > Log.DEBUG) {
return;
}
if (isDebug) {
Log.d(TAG, "[" + mClassName + "]:" + log);
}
}
public void i(String log) {
if (curLogLevel > Log.INFO) {
return;
}
if (isDebug) {
Log.i(TAG, "[" + mClassName + "]:" + log);
}
}
public void i(String log, Throwable tr) {
if (curLogLevel > Log.INFO) {
return;
}
if (isDebug) {
Log.i(TAG, "[" + mClassName + "]:" + log + "\n"
+ Log.getStackTraceString(tr));
}
}
public void w(String log) {
if (curLogLevel > Log.WARN) {
return;
}
if (isDebug) {
Log.w(TAG, "[" + mClassName + "]:" + log);
}
}
public void w(String log, Throwable tr) {
if (curLogLevel > Log.WARN) {
return;
}
if (isDebug) {
Log.w(TAG, "[" + mClassName + "]:" + log + "\n"
+ Log.getStackTraceString(tr));
}
}
public void e(String log) {
if (curLogLevel > Log.ERROR) {
return;
}
if (isDebug) {
Log.e(TAG, "[" + mClassName + "]:" + log);
}
}
public void e(String log, Throwable tr) {
if (curLogLevel > Log.ERROR) {
return;
}
if (isDebug) {
Log.e(TAG, "[" + mClassName + "]:" + log + "\n"
+ Log.getStackTraceString(tr));
}
}
}
用法一样,只是增加了打印等级控制curLogLevel
3.网上抄袭版
原文出自:http://blog.youkuaiyun.com/iplayvs2008/article/details/40422999
public class LogUtils {
private static StackTraceElement[] currentThread;
private static String tagName;
private static String msgT;
private static String msgC;
private static String callTraceStack;
private static int curLogLevel = Log.VERBOSE;
public static int getCurLogLevel() {
return curLogLevel;
}
public static void setCurLogLevel(int curLogLevel) {
LogUtils.curLogLevel = curLogLevel;
}
public synchronized static void initTrace(String msg, int... isPrintStack) {
int isPrintStackOne = isPrintStack.length > 0 ? isPrintStack[0] : 10;
currentThread = Thread.currentThread().getStackTrace();
// vm调用栈中此方法所在index:2:VMStack.java:-2:getThreadStackTrace()<--Thread.java:737:getStackTrace()<--
int curentIndex = 4;
String className = currentThread[curentIndex].getFileName();
int endIndex = className.lastIndexOf(".");
tagName = endIndex < 0 ? className : className.substring(0, endIndex);
msgT = "[" + className + ":" + currentThread[curentIndex].getLineNumber() + ":"
+ currentThread[curentIndex].getMethodName() + "()]---";
msgC = "msg:[" + msg + "]";
if (isPrintStackOne > 0) {
StringBuilder sb = new StringBuilder();
sb.append("callTraceStack:[");
for (int i = curentIndex; i < curentIndex + isPrintStackOne && i < currentThread.length; i++) {
sb.append(currentThread[i].getFileName() + ":" + currentThread[i].getLineNumber() + ":"
+ currentThread[i].getMethodName() + "()" + "<--");
}
sb.append("]");
callTraceStack = sb.toString();
msgC += callTraceStack;
}
}
public static void e(String msg, boolean printStack) {
e(msg, printStack ? 105 : 0);
}
public static void w(String msg, boolean printStackNum) {
w(msg, printStackNum ? 105 : 0);
}
public static void d(String msg, boolean printStackNum) {
d(msg, printStackNum ? 105 : 0);
}
public static void v(String msg, boolean printStackNum) {
v(msg, printStackNum ? 105 : 0);
}
public static void i(String msg, boolean printStackNum) {
i(msg, printStackNum ? 105 : 0);
}
public static void e(String msg, int... printStackNum) {
if (curLogLevel > Log.ERROR) {
return;
}
initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);
Log.e(tagName, msgT + msgC);
}
public static void w(String msg, int... printStackNum) {
if (curLogLevel > Log.WARN) {
return;
}
initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);
Log.w(tagName, msgT + msgC);
}
public static void d(String msg, int... printStackNum) {
if (curLogLevel > Log.DEBUG) {
return;
}
initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);
Log.d(tagName, msgT + msgC);
}
public static void v(String msg, int... printStackNum) {
if (curLogLevel > Log.VERBOSE) {
return;
}
initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);
Log.v(tagName, msgT + msgC);
}
public static void i(String msg, int... printStackNum) {
if (curLogLevel > Log.INFO) {
return;
}
initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);
Log.i(tagName, msgT + msgC);
}
}
说明:
1. 使用方式:LogUtil.v(“~test~”);
2.
public static void v(String msg, int… printStackNum)中printStackNum为可选参数,表示打印多少层调用栈
3.
curLogLevel表示当前打印日志的最低等级,比如设置为Log.INFO,则info以上的打印,以下的不打印,这样在Debug阶段,设置为
Log.VERBOSE,在Release阶段设置为Log.ERROR或者Log.ASSERT,就可以不打印哪些调试日志
4. 这样使用Thread.currentThread().getStackTrace(),效率可能比较低,调试可以用,发行版本,最好关闭日志如果有大神有优化方案,不吝指点一二。
总结:
|-第二种一直在用,只是麻烦在每次使用需要在各个类中实例化,传入各自的类名。
|-第三种比较方便,但是可能性能稍差吧。