在开发过程中经经常使用到Log。我们常写的一种方式就是自己定义一个LogUtil工具类

    private static boolean LOGV = true;
private static boolean LOGD = true;
private static boolean LOGI = true;
private static boolean LOGW = true;
private static boolean LOGE = true; public static void v(String tag, String mess) {
if (LOGV) { Log.v(tag, mess); }
}
public static void d(String tag, String mess) {
if (LOGD) { Log.d(tag, mess); }
}
public static void i(String tag, String mess) {
if (LOGI) { Log.i(tag, mess); }
}
public static void w(String tag, String mess) {
if (LOGW) { Log.w(tag, mess); }
}
public static void e(String tag, String mess) {
if (LOGE) { Log.e(tag, mess); }
}

这种工具类能够将log分类,在公布应用时选择性关闭log。比較方便。

但问题是,跟直接使用Log相似,须要定义一个TAG,经常使用的办法是在每一个须要打log的类定义一个静态字符串常量TAG,赋值为类名。

假设。在重构时忘记改动TAG,这样在查看log时就可能会迷糊。

当然,也有非常多人会图方便。直接用System.out.println(str);输出。

前两天看VolleyLog时,学习到一种新的方法。

    private static String getTag() {
StackTraceElement[] trace = new Throwable().fillInStackTrace()
.getStackTrace();
String callingClass = "";
for (int i = 2; i < trace.length; i++) {
Class<?> clazz = trace[i].getClass();
if (!clazz.equals(LogUtil.class)) {
callingClass = trace[i].getClassName();
callingClass = callingClass.substring(callingClass
.lastIndexOf('.') + 1);
break;
}
}
return callingClass;
}

这种方法能够直接获取到调用者的类名。

使用例如以下:

    public static void v(String mess) {
if (LOGV) { Log.v(getTag(), mess); }
}
public static void d(String mess) {
if (LOGD) { Log.d(getTag(), mess); }
}
public static void i(String mess) {
if (LOGI) { Log.i(getTag(), mess); }
}
public static void w(String mess) {
if (LOGW) { Log.w(getTag(), mess); }
}
public static void e(String mess) {
if (LOGE) { Log.e(getTag(), mess); }
}

如此就不须要再在类中定义TAG了。

在调试程序时,我们会经常打印一些信息,包含方法名/行号之类的。以下一个方法就能够省去这些麻烦:

    private static String buildMessage(String msg) {
StackTraceElement[] trace = new Throwable().fillInStackTrace()
.getStackTrace();
String caller = "";
for (int i = 2; i < trace.length; i++) {
Class<? > clazz = trace[i].getClass();
if (!clazz.equals(LogUtil.class)) {
caller = trace[i].getMethodName();
break;
}
}
return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread()
.getId(), caller, msg);
}

用法例如以下:

    public static void v(String mess) {
if (LOGV) { Log.v(getTag(), buildMessage(mess)); }
}
public static void d(String mess) {
if (LOGD) { Log.d(getTag(), buildMessage(mess)); }
}
public static void i(String mess) {
if (LOGI) { Log.i(getTag(), buildMessage(mess)); }
}
public static void w(String mess) {
if (LOGW) { Log.w(getTag(), buildMessage(mess)); }
}
public static void e(String mess) {
if (LOGE) { Log.e(getTag(), buildMessage(mess)); }
}

这样每次打印log的时候就非常方便了,直接键入:LogUtil.v(msg);

不须要管TAG,方法名。还有线程ID等等信息

再一步优化就是格式化msg的内容

buildMessage(String format, Object... args)

最后说明一下。假设大量log这样打会影响程序的性能。所以这种方法仅仅是方便在调试时使用,在公布时,能够把调试的log关闭掉。

最新文章

  1. Nodejs学习(三)-安装nodejs supervisor,提高点效率吧。
  2. 把浏览器的私有模式添加到VS中
  3. js异步加载
  4. 多线程下OpenCV操作的问题
  5. jQuery jsonp跨域请求
  6. SQLite入门与分析(八)---存储模型(2)
  7. HDU 2227 Find the nondecreasing subsequences(DP)
  8. (转)通过Net-Speeder为搬瓦工提升网速
  9. Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】
  10. Apicloud学习第三天——获取云数据库的数据方法
  11. DB2数据库常用的函数
  12. Unable to compile class for JSP 的可能原因
  13. fortran语言调用fortran写的dll
  14. 3ds max学习笔记(十六)-- 摄像机
  15. 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分
  16. Apollo分布式配置中心部署以及使用
  17. Oracle连接步骤
  18. 《javascript高级程序设计》读书笔记(一)javascript简单介绍
  19. linux 实用命令
  20. Makefile编写 五 隐含规则

热门文章

  1. 优先队列 + 并查集 + 字典树 + 欧拉回路 + 树状数组 + 线段树 + 线段树点更新 + KMP +AC自动机 + 扫描线
  2. 2015 多校赛 第七场 1011 (hdu 5379)
  3. C - Between the Offices
  4. python2.X现在不能安装Django了:Collecting django Using cached Django-2.0.tar.gz
  5. 【HTTP】如何正常关闭连接
  6. kotlin第一个项目的搭建
  7. 【Oracle】客户端监听配置
  8. semiautomatic annotated tools
  9. linux环境jdk安装及配置
  10. Java 各级注解及@Autowired注入为null解决办法