1. 程式人生 > >Android LOG標籤自定義

Android LOG標籤自定義

你如果不喜歡Android Debugger的LOG標籤(列印資訊不完整),你可以使用StackTraceElement在你的應用裡面實現簡單的LOG列印。你不需要使用System.out這個方法在程式中使用,你可以自己寫個LOG工具類來完成自己的列印需求。

下面是簡單的LogUtils類,提供了一些靜態方法,供大家參考。

/**
 * @author wangli Log工具類
 * 
 */
public final class LogUtils {

	private static boolean sIsLogEnabled = true;// 是否開啟LOG

	private static String sApplicationTag = "LogDemo";// LOG預設TAG

	private static final String TAG_CONTENT_PRINT = "%s:%s.%s:%d";

	private static StackTraceElement getCurrentStackTraceElement() {
		return Thread.currentThread().getStackTrace()[4];

	}

	//列印LOG
	public static void trace() {
		if (sIsLogEnabled) {
			android.util.Log.d(sApplicationTag,
					getContent(getCurrentStackTraceElement()));
		}
	}

	//獲取LOG
	private static String getContent(StackTraceElement trace) {
		return String.format(TAG_CONTENT_PRINT, sApplicationTag,
				trace.getClassName(), trace.getMethodName(),
				trace.getLineNumber());
	}
	//列印預設TAG的LOG
	public static void traceStack() {
		if (sIsLogEnabled) {
			traceStack(sApplicationTag, android.util.Log.ERROR);
		}
	}

	// 列印Log當前呼叫棧資訊
	public static void traceStack(String tag, int priority) {

		if (sIsLogEnabled) {
			StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
			android.util.Log.println(priority, tag, stackTrace[4].toString());
			StringBuilder str = new StringBuilder();
			String prevClass = null;
			for (int i = 5; i < stackTrace.length; i++) {
				String className = stackTrace[i].getFileName();
				int idx = className.indexOf(".java");
				if (idx >= 0) {
					className = className.substring(0, idx);
				}
				if (prevClass == null || !prevClass.equals(className)) {

					str.append(className.substring(0, idx));

				}
				prevClass = className;
				str.append(".").append(stackTrace[i].getMethodName())
						.append(":").append(stackTrace[i].getLineNumber())
						.append("->");
			}
			android.util.Log.println(priority, tag, str.toString());
		}
	}
	//指定TAG和指定內容的方法
	public static void d(String tag, String msg) {
		if (sIsLogEnabled) {
			Log.d(tag, getContent(getCurrentStackTraceElement())+">"+msg);
		}
	}
	//預設TAG和制定內容的方法
	public static void d(String msg) {
		if (sIsLogEnabled) {
			Log.d(sApplicationTag, getContent(getCurrentStackTraceElement())+">"+msg);
		}
	}
	//下面的定義和上面方法相同,可以定義不同等級的Debugger
	public static void i(String tag,String msg){
		
	}
	public static void w(String tag,String msg){
		
	}
	public static void e(String tag,String msg){
		
	}
}
Activity簡答的按鈕監聽事件。
		Button mybutton = (Button) findViewById(R.id.mybutton);
		mybutton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
			LogUtils.trace();
			LogUtils.d("test", "在這裡...");
			}
		});

列印結果
09-10 11:48:56.198: D/test(729): LogDemo:com.test.TestScreenActivity$1.onClick:35>在這裡...
09-10 11:48:56.238: D/test(729): LogDemo:com.test.TestScreenActivity$1.onClick:35>在這裡...
09-10 11:48:56.198: D/LogDemo(729): LogDemo:com.test.TestScreenActivity$1.onClick:34
09-10 11:48:56.230: D/LogDemo(729): LogDemo:com.test.TestScreenActivity$1.onClick:34
可以從LOG內容看出我們很容易的跟蹤程式碼執行,但是如果你的產品釋出,不要忘記了關閉LOG列印。