封装一个简单好用的打印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的工具类:

  1. /**
  2. * The class for print log
  3. * @author kesenhoo
  4. *
  5. */
  6. public class MyLogger
  7. {
  8. private final static boolean                logFlag         = true;
  9. public final static String                  tag             = "[AppName]";
  10. private final static int                    logLevel        = Log.VERBOSE;
  11. private static Hashtable<String, MyLogger>    sLoggerTable    = new Hashtable<String, MyLogger>();
  12. private String                              mClassName;
  13. private static MyLogger                     jlog;
  14. private static MyLogger                     klog;
  15. private static final String                 JAMES           = "@[email protected] ";
  16. private static final String                 KESEN           = "@[email protected] ";
  17. private MyLogger(String name)
  18. {
  19. mClassName = name;
  20. }
  21. /**
  22. *
  23. * @param className
  24. * @return
  25. */
  26. @SuppressWarnings("unused")
  27. private static MyLogger getLogger(String className)
  28. {
  29. MyLogger classLogger = (MyLogger) sLoggerTable.get(className);
  30. if(classLogger == null)
  31. {
  32. classLogger = new MyLogger(className);
  33. sLoggerTable.put(className, classLogger);
  34. }
  35. return classLogger;
  36. }
  37. /**
  38. * Purpose:Mark user one
  39. * @return
  40. */
  41. public static MyLogger kLog()
  42. {
  43. if(klog == null)
  44. {
  45. klog = new MyLogger(KESEN);
  46. }
  47. return klog;
  48. }
  49. /**
  50. * Purpose:Mark user two
  51. * @return
  52. */
  53. public static MyLogger jLog()
  54. {
  55. if(jlog == null)
  56. {
  57. jlog = new MyLogger(JAMES);
  58. }
  59. return jlog;
  60. }
  61. /**
  62. * Get The Current Function Name
  63. * @return
  64. */
  65. private String getFunctionName()
  66. {
  67. StackTraceElement[] sts = Thread.currentThread().getStackTrace();
  68. if(sts == null)
  69. {
  70. return null;
  71. }
  72. for(StackTraceElement st : sts)
  73. {
  74. if(st.isNativeMethod())
  75. {
  76. continue;
  77. }
  78. if(st.getClassName().equals(Thread.class.getName()))
  79. {
  80. continue;
  81. }
  82. if(st.getClassName().equals(this.getClass().getName()))
  83. {
  84. continue;
  85. }
  86. return mClassName + "[ " + Thread.currentThread().getName() + ": "
  87. + st.getFileName() + ":" + st.getLineNumber() + " "
  88. + st.getMethodName() + " ]";
  89. }
  90. return null;
  91. }
  92. /**
  93. * The Log Level:i
  94. * @param str
  95. */
  96. public void i(Object str)
  97. {
  98. if(logFlag)
  99. {
  100. if(logLevel <= Log.INFO)
  101. {
  102. String name = getFunctionName();
  103. if(name != null)
  104. {
  105. Log.i(tag, name + " - " + str);
  106. }
  107. else
  108. {
  109. Log.i(tag, str.toString());
  110. }
  111. }
  112. }
  113. }
  114. /**
  115. * The Log Level:d
  116. * @param str
  117. */
  118. public void d(Object str)
  119. {
  120. if(logFlag)
  121. {
  122. if(logLevel <= Log.DEBUG)
  123. {
  124. String name = getFunctionName();
  125. if(name != null)
  126. {
  127. Log.d(tag, name + " - " + str);
  128. }
  129. else
  130. {
  131. Log.d(tag, str.toString());
  132. }
  133. }
  134. }
  135. }
  136. /**
  137. * The Log Level:V
  138. * @param str
  139. */
  140. public void v(Object str)
  141. {
  142. if(logFlag)
  143. {
  144. if(logLevel <= Log.VERBOSE)
  145. {
  146. String name = getFunctionName();
  147. if(name != null)
  148. {
  149. Log.v(tag, name + " - " + str);
  150. }
  151. else
  152. {
  153. Log.v(tag, str.toString());
  154. }
  155. }
  156. }
  157. }
  158. /**
  159. * The Log Level:w
  160. * @param str
  161. */
  162. public void w(Object str)
  163. {
  164. if(logFlag)
  165. {
  166. if(logLevel <= Log.WARN)
  167. {
  168. String name = getFunctionName();
  169. if(name != null)
  170. {
  171. Log.w(tag, name + " - " + str);
  172. }
  173. else
  174. {
  175. Log.w(tag, str.toString());
  176. }
  177. }
  178. }
  179. }
  180. /**
  181. * The Log Level:e
  182. * @param str
  183. */
  184. public void e(Object str)
  185. {
  186. if(logFlag)
  187. {
  188. if(logLevel <= Log.ERROR)
  189. {
  190. String name = getFunctionName();
  191. if(name != null)
  192. {
  193. Log.e(tag, name + " - " + str);
  194. }
  195. else
  196. {
  197. Log.e(tag, str.toString());
  198. }
  199. }
  200. }
  201. }
  202. /**
  203. * The Log Level:e
  204. * @param ex
  205. */
  206. public void e(Exception ex)
  207. {
  208. if(logFlag)
  209. {
  210. if(logLevel <= Log.ERROR)
  211. {
  212. Log.e(tag, "error", ex);
  213. }
  214. }
  215. }
  216. /**
  217. * The Log Level:e
  218. * @param log
  219. * @param tr
  220. */
  221. public void e(String log, Throwable tr)
  222. {
  223. if(logFlag)
  224. {
  225. String line = getFunctionName();
  226. Log.e(tag, "{Thread:" + Thread.currentThread().getName() + "}"
  227. + "[" + mClassName + line + ":] " + log + "\n", tr);
  228. }
  229. }
  230. }

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

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

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.view.View.OnClickListener;
  5. import android.widget.Button;
  6. public class ActivityMain extends Activity
  7. {
  8. private MyLogger logger = MyLogger.kLog();
  9. private MyLogger logger2 = MyLogger.jLog();
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState)
  12. {
  13. // TODO Auto-generated method stub
  14. super.onCreate(savedInstanceState);
  15. logger.i("This is log [01]");
  16. setContentView(R.layout.main);
  17. Button button = (Button) this.findViewById(R.id.button);
  18. button.setOnClickListener(new OnClickListener() {
  19. @Override
  20. public void onClick(View arg0)
  21. {
  22. // TODO Auto-generated method stub
  23. logger2.i("This is James action button.OnClick");
  24. }
  25. });
  26. }
  27. @Override
  28. protected void onResume()
  29. {
  30. // TODO Auto-generated method stub
  31. super.onResume();
  32. logger.d("This is kesen log [02]");
  33. }
  34. @Override
  35. protected void onPause()
  36. {
  37. // TODO Auto-generated method stub
  38. super.onPause();
  39. logger.w("This is kesen log [03]");
  40. }
  41. @Override
  42. protected void onStop()
  43. {
  44. // TODO Auto-generated method stub
  45. super.onStop();
  46. logger.v("This is kesen log [04]");
  47. }
  48. @Override
  49. protected void onDestroy()
  50. {
  51. // TODO Auto-generated method stub
  52. super.onDestroy();
  53. logger.e("This is kesen log [05]");
  54. }
  55. }

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

从上面的解释差不多可以看出这个Log工具类具有的功能:
0.使用一个标签来标记当前的AP
1.支持多用户打印Log(在AP比较大,文件比较多,每人负责的模块不同时,可以使用自己的log来打印,这样看log的时候可以快速筛选出当前AP中你所设置的Log,比如只看     kesen的log就可以在Eclipse的filter里面输入kesen,这样显示的就都是你的log了)
2.显示当前的线程名
3.显示当前的Java文件与打印log的行号,便于快速定位到源文件
4.显示当前是在那个方法体里面
5.最后显示你设置打印出来的信息

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

时间: 2024-10-13 12:18:52

封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类的相关文章

Python+Selenium进阶版(八)- Python自定义封装一个简单的Log类

目标:如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里. 练习场景: 我们需要封装一个简单的日志类,主要有以下内容: 1.生成的日志文件格式是 年月日分秒.log 2.生成的XXX.log文件存储在项目根目录下Logs文件夹下 3.这个日志类,支持INFO,ERROR两种日志级别 4.日志里,每行日志输出,时间日期+执行类名称+日志级别+日志描述 解决思路: 1.在根目录下新建一个Logs的文件夹,获取这个Log的相对路径: 2.日志的保存命名,需要系统时间:

代码改变世界 | 如何封装一个简单的 Koa

下面给大家带来:封装一个简单的 KoaKoa 是基于 Node.js 平台的下一代 web 开发框架Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装一个简单的 Koa一个简单的 http 服务使用 node 提供的 http 模块,可以很容易的实现一个基本的 http 服务器,新建一个 application.js 文件,内容如下: const http = require('http') const server = http.createSer

Directx11学习笔记【四】 封装一个简单的Dx11DemoBase

根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBase.h Dx11DemoBase.h #pragma once #include <d3d11.h> #include <D3DX11.h> #include <DxErr.h> class Dx11DemoBase { public: Dx11DemoBase(); vi

封装一个简单的solrserver组件

一个简单的solrserver组件 实现索引更新的异步处理,以及查询接口,日志/线程池/队列监控没有加上. SolrDocment封装 接口: public interface ISolrDocument { public SolrInputDocument convertToInputDocument() throws Exception; public void buildSolrDocument(SolrDocument document) throws Exception; } 实现:

C 封装一个简单二叉树基库

引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷酷现实的打击:这种打击常无情地加诸于每个脱离现实环境生活的  人.或许高斯讲求实效和追求完美的性格,有助于让他抓住生活中的简单现实.  高斯22岁获博士学位,25岁当选圣彼德堡科学院外籍院士,30岁任哥廷根大学数  学教授兼天文台台长.虽说高斯不喜欢浮华荣耀,但在他成名后的五十年间,这  些东西就像

封装一个简单的UI组件

方法其实很简单,用一个函数把整个过程包起来.调用时用new,这样可以在一个页面使用多个改组件.这是一个非常简单的方法,后面还有很大改进的空间.下面是一个封装日历的示例. 现在我们的组件类似bootstrap,写好下面的html结构,然后引入ui.css和ui.js,就可以生成相应的UI组件了.效果如上图. <!doctype html> <html> <head> <meta charset="UTF-8"> <title>C

vue封装一个简单的div框选时间的组件

记录一下我前段时间封装的一个vue组件吧.技术需要积累,有时间我把我之前写的还不错的组件都开源出来.并尝试vue和react 两种方式的组件封装.今天简单写下鼠标框选div选中效果的封装吧. div框选实现 div框选效果,其实没有什么好的方法,就是获取鼠标事件,根据鼠标的位置,动态创建一个跟随鼠标的div.[注:这种方式需要依赖position的定位方式,一般鼠标事件位置是针对全局的,所以鼠标框选的div 位置的position最好父级元素是根元素的定位.不然,鼠标框选区域和被框选区域很难保持

封装一个简单的隔行换色

代码运行效果:笔者接触JS时间不长,对于传参和封装函数理解不够透彻,经过多次练习稍有感悟,为了加深理解写了这篇简单的隔行换色,希望能对刚接触JS的朋友有所帮助,以下是程序代码:<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title> <style> *{margin:0;padding:

封装一个简单的原生js焦点轮播图插件

轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放.本篇文章的主要目的是分享封装插件的思路. 轮播图的我一开始是写成非插件形式实现的效果,后来才改成了封装成插件的形式. 首先要明白轮播图的实现原理和基本布局,大概就是外面有一个容器包裹着(通常是div),容器设置宽高,以及overflow为hidden,超出宽高部分隐藏, 容器里面又包含着另一个容器,包裹着所有的图片,宽为所有图片的总宽度,ul的position为absolute,通过改变ul的left