android开发之自定义log工具
来源:互联网 发布:软件开发相关职位 编辑:程序博客网 时间:2024/05/16 14:45
前言
log日志输出在实际开发的过程中,使用频率是非常高的,每天都在用,那么问题容易出在哪个环节?体现在控制!因为log输出的往往都是项目的核心数据,也就是业务数据。当项目运行在生产环境下的时候,一旦产生数据泄漏,这就不叫bug了,那就是事故!所以,虽然log常用,但是能用到什么水平,那就是功底的问题。
原理剖析
eclipse下,随便生成一个android项目,基础文件生成出来之后,会有一个很特别的一级目录gen,这个目录下面有会一个二级目录,二级目录下面只有两个固定的文件,一个是R文件,这个文件里面是自动生成的,里面主要标识的是项目内所有资源的定位信息。另外一个文件就是BuildConfi.java,这个文件里面有一个静态的boolean值。具体定义是这个样子的,如下:
public final class BuildConfig { public final static boolean DEBUG = true;}
不用疑惑,只要你在eclipse下创建新的android项目,这个目录就存在,而且它就是这个样子。它的特性在于,当项目在debug签名情况下是为true,但是当项目打上签名之后,这个值会自动变成false。那么就利用这个特性,控制log日志的输出。
Logger
public class Logger { public Logger() { } public void v(String format, Object... args) { } public void d(String format, Object... args) { } public void i(String format, Object... args) { } public void w(String format, Object... args) { } public void w(Throwable tr, String format, Object... args) { } public void e(String format, Object... args) { } public void e(Throwable tr, String format, Object... args) { } public void wtf(String format, Object... args) { } public void wtf(Throwable tr, String format, Object... args) { }}
LogManager
public class LogManager { public static final String Default_Tag = "TAGINFO"; private static Logger Logger; private static HashMap<String,Logger> LoggerMap = null; public static Logger getLogger() { return getLogger(null); } public static Logger getLogger(String tag) { if(BuildConfig.DEBUG) { return getDebugLogger(tag); } else { if (Logger == null) { Logger = new Logger(); } return Logger; } } private static Logger getDebugLogger(String tag) { if(null == tag) tag = Default_Tag; Logger logger; if(null == LoggerMap) { synchronized (LogManager.class) { if(null == LoggerMap) LoggerMap = new HashMap<String,Logger>(); } } if (LoggerMap.containsKey(tag)) logger = LoggerMap.get(tag); else { logger = new DebugLogger(tag); LoggerMap.put(tag, logger); } return logger; } private static class DebugLogger extends Logger { private String tag; private DebugLogger(String tag) { if(null != this.tag && tag == this.tag) return; this.tag = null == tag? LogManager.Default_Tag:tag; } @Override public void v(String format, Object... args) { Log.v(tag, buildSimpleMessage(format, args)); } @Override public void d(String format, Object... args) { Log.d(tag, buildSimpleMessage(format, args)); } @Override public void i(String format, Object... args) { Log.i(tag, buildSimpleMessage(format, args)); } @Override public void w(String format, Object... args) { Log.w(tag, buildMessage(format, args)); } @Override public void w(Throwable tr, String format, Object... args) { Log.w(tag, buildMessage(format, args), tr); } @Override public void e(String format, Object... args) { Log.e(tag, buildMessage(format, args)); } @Override public void e(Throwable tr, String format, Object... args) { Log.e(tag, buildMessage(format, args), tr); } @Override public void wtf(String format, Object... args) { Log.wtf(tag, buildMessage(format, args)); } @Override public void wtf(Throwable tr, String format, Object... args) { Log.wtf(tag, buildMessage(format, args), tr); } private String buildSimpleMessage(String format, Object... args) { return (args == null) ? format : String.format(Locale.US, format, args); } private String buildMessage(String format, Object... args) { String msg = buildSimpleMessage(format, args); StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace(); String caller = "<unknown>"; for (int i = 2; i < trace.length; i++) { Class<?> clazz = trace[i].getClass(); if (!clazz.equals(DebugLogger.class)) { String callingClass = trace[i].getClassName(); callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1); callingClass = callingClass.substring(callingClass.lastIndexOf('$') + 1); caller = callingClass + "." + trace[i].getMethodName(); break; } } return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread().getId(), caller, msg); } }}
使用
LogManager.getLogger().d("keyvalues: %s, keyvalues: %s",values, values);
上述中, %s 设置以字符串格式输出,keyvalues自定数据串标识,values表示和keyvalues对应的实体数据
总结
log日志如何使用直接决定了项目开发的效率,这个和注释是一个样子的。虽然很基础的东西,但是往往都是在项目开发过程中最重要的东西。以网络请求为例,请求的接口地址,参数,返回数据,等一系列数据,通过log输出后,不需要进行UI验证,直接通过数据就验证了业务的精准性。在logcat中,以自定义的TAG为自定义过滤的TAG,直接将数据输出出来,方便开发,方便维护。并且通过这种方式,在测试阶段日志正常输出,但是一旦签名之后,即便设备root之后,通过shell采集数据,这个也一样不会输出。
忠告
敬告各位同行,研发无小事,慎重对待每一个细节。
0 0
- android开发之自定义log工具
- android开发之自定义log工具
- Android 编程技巧之 ----- 自定义 Log 工具
- android 自定义Log日志工具
- IOS开发之自定义Log
- Android开发中实用工具之--Log工具类
- Android Log工具之Luffy
- Android常用工具类之 Log工具类
- Android 编写工具类之Log
- Android技巧之封装Log工具类
- Android分享之Log工具类
- Android工具之Log信息写入储存卡
- Android应用开发之自定义View触摸相关工具类全解
- Android应用开发之自定义View触摸相关工具类全解
- Android开发之封装log打印日志的工具类,实用logutils详细代码
- android中超实用自定义log日志输出工具类
- Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
- Android项目工具类之封装Log工具类
- Python源码剖析笔记0 ——C语言基础
- 【App--电子商务】业务流程
- git安装与使用
- OC--Foundation 框架(2)
- Struts2配置文件讲解
- android开发之自定义log工具
- MYSQL加锁的测验
- QSqlDatabase文档简要翻译(用法)
- HTML 无序排列 有序排列 框架
- 由洗牌算法说开去
- 仿网易云音乐 专辑图片折叠轮播
- python源码剖析笔记1——Python对象初见
- java 守护线程总结
- java反射