對於Android系統Log輸出日誌的封裝LogUtils
MainActivity如下:
package cc.cn.logutil;import android.os.Bundle;import android.app.Activity;/** * Demo描述: * 對於Android系統Log輸出日誌的封裝LogUtils * 1 可修改LogUtils中的LEVEL值覺得哪些層級的日誌可以輸出. * 所以方便選擇性輸出日誌或者屏蔽日誌輸出 * 2 輸出的日誌除了本想輸出的資訊外還包含了該日誌輸出時所屬 * 的線程,類,方法名,已經在該方法中的行數等實用資訊 * 3 LogUtils的調用方式 * 3.1 按照系統原方式調用 * 3.2 或者不設定TAG,則預設為檔案名稱 * * 備忘說明: * 在該樣本中主要用到了StackTrace和StackTraceElement. * 詳情可參見上篇部落格《StackTrace簡述以及StackTraceElement使用執行個體》 * * PS: * 今天有些感冒,有些發燒.下班後完成這個樣本,算是一種慰藉吧 * 2014年9月23日23:05:01. */public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);LogUtils.i("MainActivity", "onCreate1");LogUtils.i(null, "onCreate2");LogUtils.i("", "onCreate3");LogUtils.i("onCreate4");test();}private void test() {LogUtils.i("調用了MainActivity中的test()");TestLog.testLog();new Thread() {public void run() {LogUtils.i("調用了子線程");};}.start();}@Overrideprotected void onStart() {super.onStart();LogUtils.i("onStart");}@Overrideprotected void onResume() {super.onResume();LogUtils.i("onResume");}@Overrideprotected void onPause() {super.onPause();LogUtils.i("onPause");}@Overrideprotected void onStop() {super.onStop();LogUtils.i("onStop");}@Overrideprotected void onDestroy() {super.onDestroy();LogUtils.i("onDestroy");}}
LogUtils如下:
package cc.cn.logutil;import android.text.TextUtils;import android.util.Log;/** * LogUtils工具說明: * 1 只輸出等級大於等於LEVEL的日誌 * 所以在開發和產品發布後通過修改LEVEL來選擇性輸出日誌. * 當LEVEL=NOTHING則屏蔽了所有的日誌. * 2 v,d,i,w,e均對應兩個方法. * 若不設定TAG或者TAG為空白則為設定預設TAG * */public class LogUtils {public static final int VERBOSE = 1;public static final int DEBUG = 2;public static final int INFO = 3;public static final int WARN = 4;public static final int ERROR = 5;public static final int NOTHING = 6;public static final int LEVEL = VERBOSE;public static final String SEPARATOR = ",";public static void v(String message) {if (LEVEL <= VERBOSE) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];String tag = getDefaultTag(stackTraceElement);Log.v(tag, getLogInfo(stackTraceElement) + message);}}public static void v(String tag, String message) {if (LEVEL <= VERBOSE) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];if (TextUtils.isEmpty(tag)) {tag = getDefaultTag(stackTraceElement);}Log.v(tag, getLogInfo(stackTraceElement) + message);}}public static void d(String message) {if (LEVEL <= DEBUG) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];String tag = getDefaultTag(stackTraceElement);Log.d(tag, getLogInfo(stackTraceElement) + message);}}public static void d(String tag, String message) {if (LEVEL <= DEBUG) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];if (TextUtils.isEmpty(tag)) {tag = getDefaultTag(stackTraceElement);}Log.d(tag, getLogInfo(stackTraceElement) + message);}}public static void i(String message) {if (LEVEL <= INFO) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];String tag = getDefaultTag(stackTraceElement);Log.i(tag, getLogInfo(stackTraceElement) + message);}}public static void i(String tag, String message) {if (LEVEL <= INFO) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];if (TextUtils.isEmpty(tag)) {tag = getDefaultTag(stackTraceElement);}Log.i(tag, getLogInfo(stackTraceElement) + message);}}public static void w(String message) {if (LEVEL <= WARN) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];String tag = getDefaultTag(stackTraceElement);Log.w(tag, getLogInfo(stackTraceElement) + message);}}public static void w(String tag, String message) {if (LEVEL <= WARN) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];if (TextUtils.isEmpty(tag)) {tag = getDefaultTag(stackTraceElement);}Log.w(tag, getLogInfo(stackTraceElement) + message);}}public static void e(String tag, String message) {if (LEVEL <= ERROR) {StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];if (TextUtils.isEmpty(tag)) {tag = getDefaultTag(stackTraceElement);}Log.e(tag, getLogInfo(stackTraceElement) + message);}}/** * 擷取預設的TAG名稱. * 比如在MainActivity.java中調用了日誌輸出. * 則TAG為MainActivity */public static String getDefaultTag(StackTraceElement stackTraceElement) {String fileName = stackTraceElement.getFileName();String stringArray[] = fileName.split("\\.");String tag = stringArray[0];return tag;}/** * 輸出日誌所包含的資訊 */public static String getLogInfo(StackTraceElement stackTraceElement) {StringBuilder logInfoStringBuilder = new StringBuilder();// 擷取線程名String threadName = Thread.currentThread().getName();// 擷取線程IDlong threadID = Thread.currentThread().getId();// 擷取檔案名稱.即xxx.javaString fileName = stackTraceElement.getFileName();// 擷取類名.即包名+類名String className = stackTraceElement.getClassName();// 擷取方法名稱String methodName = stackTraceElement.getMethodName();// 擷取生日輸出行數int lineNumber = stackTraceElement.getLineNumber();logInfoStringBuilder.append("[ ");logInfoStringBuilder.append("threadID=" + threadID).append(SEPARATOR);logInfoStringBuilder.append("threadName=" + threadName).append(SEPARATOR);logInfoStringBuilder.append("fileName=" + fileName).append(SEPARATOR);logInfoStringBuilder.append("className=" + className).append(SEPARATOR);logInfoStringBuilder.append("methodName=" + methodName).append(SEPARATOR);logInfoStringBuilder.append("lineNumber=" + lineNumber);logInfoStringBuilder.append(" ] ");return logInfoStringBuilder.toString();}}
TestLog如下:
package cc.cn.logutil;public class TestLog { public static void testLog(){ LogUtils.i("調用了TestLog中的testLog()"); }}
main.xml如下: