当前位置: 首页 > news >正文

【Android】封装一个简单好用的打印Log的工具类


不知众多Android开发者是否在程序开发的工程中也遇到过下面的问题:

0.如何在众多log中快速找到你设置打印的那行log?

1.是否还在不断的切换标签来查看使用不同TAG标签打印的log?

2.找到需要的log后是否苦恼不能快速定位到Java源代码中查看?


起初我也和大多数Android开发者一样,使用官方的打印log的方法,设置TAG,在Eclipse里面设置过滤标签,切换来回的看Log,可是这样却效率很低,会遇到上面所述的问题,那么现在我就把学习到的一种方便快捷的打印Log的方法分享给大家,有不对的地方还望不吝赐教,谢谢。

Log类具有的功能

0.使用一个标签来标记当前的AP(避免设置过多的TAG来过滤显示不同Java文件下的Log)

1.支持多用户打印Log(在AP比较大,文件比较多,每人负责的模块不同时,可以使用自己的log来打印,这样看log的时候可以快速筛选出当前AP中你所设置的Log,比如只看 kesen的log就可以在Eclipse的filter里面输入kesen,这样显示的就都是你的log了)

2.显示当前的线程名

3.显示当前的Java文件与打印log的行号,便于快速定位到源文件

4.显示当前是在那个方法体里面

5.最后显示你设置打印出来的信息


下面是一个打印Log的工具类:

package com.htc.hoo;

import java.util.Hashtable;
import android.util.Log;

/**
 * The class for print log
 * @author kesenhoo
 *
 */
public class MyLogger
{
	private final static boolean				logFlag			= true;
	
	public final static String					tag				= "[AppName]";
	private final static int					logLevel		= Log.VERBOSE;
	private static Hashtable<String, MyLogger>	sLoggerTable	= new Hashtable<String, MyLogger>();
	private String								mClassName;
	
	private static MyLogger						jlog;
	private static MyLogger						klog;
	
	private static final String					JAMES			= "@james@ ";
	private static final String					KESEN			= "@kesen@ ";
	
	private MyLogger(String name)
	{
		mClassName = name;
	}
	
	/**
	 * 
	 * @param className
	 * @return
	 */
	@SuppressWarnings("unused")
	private static MyLogger getLogger(String className)
	{
		MyLogger classLogger = (MyLogger) sLoggerTable.get(className);
		if(classLogger == null)
		{
			classLogger = new MyLogger(className);
			sLoggerTable.put(className, classLogger);
		}
		return classLogger;
	}
	
	/**
	 * Purpose:Mark user one
	 * @return
	 */
	public static MyLogger kLog()
	{
		if(klog == null)
		{
			klog = new MyLogger(KESEN);
		}
		return klog;
	}
	/**
	 * Purpose:Mark user two
	 * @return
	 */
	public static MyLogger jLog()
	{
		if(jlog == null)
		{
			jlog = new MyLogger(JAMES);
		}
		return jlog;
	}
	
	/**
	 * Get The Current Function Name
	 * @return
	 */
	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;
	}
	
	/**
	 * The Log Level:i
	 * @param str
	 */
	public void i(Object str)
	{
		if(logFlag)
		{
			if(logLevel <= Log.INFO)
			{
				String name = getFunctionName();
				if(name != null)
				{
					Log.i(tag, name + " - " + str);
				}
				else
				{
					Log.i(tag, str.toString());
				}
			}
		}
		
	}
	
	/**
	 * The Log Level:d
	 * @param str
	 */
	public void d(Object str)
	{
		if(logFlag)
		{
			if(logLevel <= Log.DEBUG)
			{
				String name = getFunctionName();
				if(name != null)
				{
					Log.d(tag, name + " - " + str);
				}
				else
				{
					Log.d(tag, str.toString());
				}
			}
		}
	}
	
	/**
	 * The Log Level:V
	 * @param str
	 */
	public void v(Object str)
	{
		if(logFlag)
		{
			if(logLevel <= Log.VERBOSE)
			{
				String name = getFunctionName();
				if(name != null)
				{
					Log.v(tag, name + " - " + str);
				}
				else
				{
					Log.v(tag, str.toString());
				}
			}
		}
	}
	
	/**
	 * The Log Level:w
	 * @param str
	 */
	public void w(Object str)
	{
		if(logFlag)
		{
			if(logLevel <= Log.WARN)
			{
				String name = getFunctionName();
				if(name != null)
				{
					Log.w(tag, name + " - " + str);
				}
				else
				{
					Log.w(tag, str.toString());
				}
			}
		}
	}
	
	/**
	 * The Log Level:e
	 * @param str
	 */
	public void e(Object str)
	{
		if(logFlag)
		{
			if(logLevel <= Log.ERROR)
			{
				String name = getFunctionName();
				if(name != null)
				{
					Log.e(tag, name + " - " + str);
				}
				else
				{
					Log.e(tag, str.toString());
				}
			}
		}
	}
	
	/**
	 * The Log Level:e
	 * @param ex
	 */
	public void e(Exception ex)
	{
		if(logFlag)
		{
			if(logLevel <= Log.ERROR)
			{
				Log.e(tag, "error", ex);
			}
		}
	}
	
	/**
	 * The Log Level:e
	 * @param log
	 * @param tr
	 */
	public void e(String log, Throwable tr)
	{
		if(logFlag)
		{
			String line = getFunctionName();
			Log.e(tag, "{Thread:" + Thread.currentThread().getName() + "}"
					+ "[" + mClassName + line + ":] " + log + "\n", tr);
		}
	}
}


 

 

关于里面的代码就不做解释了,大家看看应该差不多

使用案例:

这是我写的一个简单的带有一个button与textview的Activity,演示一下点击button与Activity的常规生命周期。

package com.htc.hoo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ActivityMain extends Activity
{
	private MyLogger logger = MyLogger.kLog();
	private MyLogger logger2 = MyLogger.jLog();
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		logger.i("This is log [01]");
		setContentView(R.layout.main);
		
		Button button = (Button) this.findViewById(R.id.button);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0)
			{
				// TODO Auto-generated method stub
				logger2.i("This is James action button.OnClick");
			}
		});
	}
	
	@Override
	protected void onResume()
	{
		// TODO Auto-generated method stub
		super.onResume();
		logger.d("This is kesen log [02]");
	}
	
	@Override
	protected void onPause()
	{
		// TODO Auto-generated method stub
		super.onPause();
		logger.w("This is kesen log [03]");
	}

	@Override
	protected void onStop()
	{
		// TODO Auto-generated method stub
		super.onStop();
		logger.v("This is kesen log [04]");
	}
	
	@Override
	protected void onDestroy()
	{
		// TODO Auto-generated method stub
		super.onDestroy();
		logger.e("This is kesen log [05]");
	}
}


 
 

 
 

下面是用这个log工具类打印出来的Log效果:


解释一下关于打印的log:


从上面的解释差不多可以看出这个Log工具类具有的功能:

0.使用一个标签来标记当前的AP

1.支持多用户打印Log(在AP比较大,文件比较多,每人负责的模块不同时,可以使用自己的log来打印,这样看log的时候可以快速筛选出当前AP中你所设置的Log,比如只看 kesen的log就可以在Eclipse的filter里面输入kesen,这样显示的就都是你的log了)

2.显示当前的线程名

3.显示当前的Java文件与打印log的行号,便于快速定位到源文件

4.显示当前是在那个方法体里面

5.最后显示你设置打印出来的信息


写的不好,有不对的地方还请见谅,谢谢!



 
 
 
 
 

                

相关文章:

  • centos7 防火墙 开启端口 并测试
  • 设计模式
  • IDA.快捷键_ZC收集
  • 直接从google中引入jquery.js
  • Sql注入攻击
  • linux下vsftpd客户端时间不一致问题
  • 3.2 使用STC89C52控制MC20发送短信
  • POJ 2823 Sliding Window 单调队列
  • 别人做的扫地机器人,有机会我也想搞一台!
  • backgroundworker与Thread区别
  • 数据类型--字符串
  • 如果在BackgroundWorker运行过程中关闭窗体…
  • [TestLink]testlink安装
  • 【Android】使用AsyncTask来处理一些简单的需要后台处理的动作
  • 如何让你的网页加载时间降低到 1s 内
  • @jsonView过滤属性
  • 【面试系列】之二:关于js原型
  • 07.Android之多媒体问题
  • Babel配置的不完全指南
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • chrome扩展demo1-小时钟
  • Druid 在有赞的实践
  • Flannel解读
  • HTML5新特性总结
  • Javascript Math对象和Date对象常用方法详解
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Theano - 导数
  • 浏览器缓存机制分析
  • 巧用 TypeScript (一)
  • 如何在 Tornado 中实现 Middleware
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 数据仓库的几种建模方法
  • 算法-插入排序
  • 探索 JS 中的模块化
  • 学习HTTP相关知识笔记
  • 移动端唤起键盘时取消position:fixed定位
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (27)4.8 习题课
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (笔试题)合法字符串
  • (多级缓存)缓存同步
  • (二)正点原子I.MX6ULL u-boot移植
  • (五)网络优化与超参数选择--九五小庞
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (一)为什么要选择C++
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)详解PHP处理密码的几种方式
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】