开发经验总结(打造更优秀的日志输出工具类)

Android系统已经为我们提供了非常优秀的日志输出类Log,那么为什么我们还要打造属于自己的日志输出呢?请大家考虑这个问题

下面我来讲解一下我对这个问题的理解


首先

系统的工具类有天然的不可修改性,不利于扩张。log是系统内部提供的类,用户不允许改到,所以没有办法 添加方法去扩张类的功能,开发一个项目 几乎每个类都有很多打印日志方法,根据经验几乎每个人都有这样的经历。那么问题来了。如果一个类里打印了10条log 如何去精确定位是哪一行代码执行的呢,这个是系统部提供的,但是可以通过自定义log输出方式输出具体代码位置。


其次

系统的日志类使用起来有一点点麻烦,每个日志有两个 参数类似这样Log.i(tag, str.toString());

第一个tag一般是为了标记这个日志的,程序开发过程中一般使用类名以方便查找和定位,不过这带来的是确实非常多的重复劳动,比如每个需要用log的类都需要一个类名的TAG,使用时候还需要引用,如果可以自动生成应该是更完美的解决方式 。因为log 太常用了,使用自定义自动生成tag 的方式可以大大提高效率。


以上仅为个人见解,如果有更多好的建议请留言探讨。下面会发布一个个人精简的log源码 


package com.jumige.mobile.allinone.utils;

import android.util.Log;
/**
 * 日志工具类
 * 使打印日志变得简单 自动识别调用日志函数的类名 方法名 与位置
 * 不需要繁琐的TAG 
 * 可以方便的 设置debug模式 发布时候 可以直接修改debug为false 就不会输出日志了
 * @author mathschild
 *
 */
public class LogUtil {
	
	/**   
	 * @Title:         @LogUtil.java 
	 * @Description:   日志输出类 
	 * @author         Wang Shuhai
	 * @email          mathschild@126.com
	 * @date           @2014-9-20  @下午5:13:49
	 * @version        V1.0   
	 */
	
	/**
	 * 关闭日志输出
	 */
	private static boolean OPEN_LOG = true;
	/**
	 * 关闭DEBUG日志输出
	 */
	private static boolean DEBUG = true;
	/**
	 * TAG 名称
	 */ 
	private static String tag = "[app]";
	private String mClassName;
	private static LogUtil log;
	private static final String USER_NAME = "@user@";

	private LogUtil(String name) {
		mClassName = name;
	}

	/**
	 * Get The Current Function Name
	 * 
	 * @return Name
	 */
	private String getFunctionName() {
		StackTraceElement[] sts = Thread.currentThread().getStackTrace();
		if (sts == null) {
			return null;
		}
		for (StackTraceElement st : sts) {
			if (st.isNativeMethod()) {
				continue;
			}
			if (st.getClassName().equals(Thread.class.getName())) {
				continue;
			}
			if (st.getClassName().equals(this.getClass().getName())) {
				continue;
			}
			return mClassName + "[ " + Thread.currentThread().getName() + ": "
					+ st.getFileName() + ":" + st.getLineNumber() + " "
					+ st.getMethodName() + " ]";
		}
		return null;
	}

	
	public static void i(Object str) {
		print(Log.INFO, str);
	}

	public static void d(Object str) {
		print(Log.DEBUG, str);
	}

	public static void v(Object str) {
		print(Log.VERBOSE, str);
	}

	public static void w(Object str) {
		print(Log.WARN, str);
	}

	public static void e(Object str) {
		print(Log.ERROR, str);
	}

	/**
	 * 用于区分不同接口数据 打印传入参数
	 * @param index 
	 * @param str
	 */
	  
	 
	private static void print(int index, Object str) {
		if (!OPEN_LOG) {
			return;
		}
		if (log == null) {
			log = new LogUtil(USER_NAME);
		} 
		String name = log.getFunctionName();
		if (name != null) {
			str = name + " - " + str;
		}
		
		//Close the debug log When DEBUG is false 
		if(!DEBUG){
			if(index<=Log.DEBUG){
				return;
			}
		}
		switch (index) {
		case Log.VERBOSE:
			Log.v(tag, str.toString());
			break;
		case Log.DEBUG:
			Log.d(tag, str.toString());
			break;
		case Log.INFO:
			Log.i(tag, str.toString());
			break;
		case Log.WARN:
			Log.w(tag, str.toString());
			break;
		case Log.ERROR:
			Log.e(tag, str.toString());
			break;
		default:
			break;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值