封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类
http://blog.csdn.net/lmj623565791/article/details/38965311
------------------------------------------------------------------------------------------------
不知众多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的工具类:
- /**
- * 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的常规生命周期。
- 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工具类具有的功能:
0.使用一个标签来标记当前的AP
1.支持多用户打印Log(在AP比较大,文件比较多,每人负责的模块不同时,可以使用自己的log来打印,这样看log的时候可以快速筛选出当前AP中你所设置的Log,比如只看 kesen的log就可以在Eclipse的filter里面输入kesen,这样显示的就都是你的log了)
2.显示当前的线程名
3.显示当前的Java文件与打印log的行号,便于快速定位到源文件
4.显示当前是在那个方法体里面
5.最后显示你设置打印出来的信息
写的不好,有不对的地方还请见谅,谢谢!
封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类的更多相关文章
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- Python之自定义封装一个简单的Log类
参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...
- Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》
Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676
- 代码改变世界 | 如何封装一个简单的 Koa
下面给大家带来:封装一个简单的 Koa Koa 是基于 Node.js 平台的下一代 web 开发框架 Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装 ...
- Directx11学习笔记【四】 封装一个简单的Dx11DemoBase
根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...
- 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件
先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...
- C 封装一个简单二叉树基库
引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而 没有遭受到冷 ...
- 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?
历史溯源 由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP.FTP.POP3.SMTP.Telnet等.早期操作系统UNIX( ...
- vue封装一个简单的div框选时间的组件
记录一下我前段时间封装的一个vue组件吧.技术需要积累,有时间我把我之前写的还不错的组件都开源出来.并尝试vue和react 两种方式的组件封装.今天简单写下鼠标框选div选中效果的封装吧. div框 ...
随机推荐
- iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...
- Hadoop数据传输工具:Sqoop
Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流.用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Had ...
- JAVA线程池ThreadPoolExecutor-转
首先是构造函数签名如下: public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeU ...
- python psutil 模块
一.获取系统性能信息 1 .CPU信息 User time,执行用户进程的时间百分比 System time,执行内核进程和中断的百分比 Wait IO,由于IO等待而使CPU处于idle(空闲)状态 ...
- linux Shell的使用
linux Shell的使用 下面是我对shell脚本使用的学习,写成日志,做个笔记,可以当做自己以后的复习. 1.输出hello world! vi test1.sh, 如果不会vi工具的使用,请参 ...
- 多线程编程之Windows同步方式
在Windows环境下针对多线程同步与互斥操作的支持,主要包括四种方式:临界区(CriticalSection).互斥对象(Mutex).信号量(Semaphore).事件对象(Event).下面分别 ...
- 从客户端中检测到有潜在危险的Request.Form值 的解决方法
在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止X ...
- bzoj1201: [HNOI2005]数三角形
Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...
- Winfrom DateGridView 实现Button列禁用
Form窗体如下所示: 实现如下: using System; using System.Collections.Generic; using System.Drawing; using System ...
- Mongodb集群搭建及spring和java连接配置记录
一.基本环境: mongdb3.0.5数据库 spring-data-mongodb-1.7.2.jar mongo-java-driver-3.0.2.jar linux-redhat6.3 tom ...