开发经验总结(打造更优秀的日志输出工具类)
Android系统已经为我们提供了非常优秀的日志输出类Log,那么为什么我们还要打造属于自己的日志输出呢?请大家考虑这个问题
下面我来讲解一下我对这个问题的理解
首先
系统的工具类有天然的不可修改性,不利于扩张。log是系统内部提供的类,用户不允许改到,所以没有办法 添加方法去扩张类的功能,开发一个项目 几乎每个类都有很多打印日志方法,根据经验几乎每个人都有这样的经历。那么问题来了。如果一个类里打印了10条log 如何去精确定位是哪一行代码执行的呢,这个是系统部提供的,但是可以通过自定义log输出方式输出具体代码位置。
其次
系统的日志类使用起来有一点点麻烦,每个日志有两个 参数类似这样Log.i(tag, str.toString());
第一个tag一般是为了标记这个日志的,程序开发过程中一般使用类名以方便查找和定位,不过这带来的是确实非常多的重复劳动,比如每个需要用log的类都需要一个类名的TAG,使用时候还需要引用,如果可以自动生成应该是更完美的解决方式 。因为log 太常用了,使用自定义自动生成tag 的方式可以大大提高效率。
以上仅为个人见解,如果有更多好的建议请留言探讨。下面会发布一个个人精简的log源码
package com.jumige.mobile.allinone.utils;import android.util.Log;
/*** 日志工具类* 使打印日志变得简单 自动识别调用日志函数的类名 方法名 与位置* 不需要繁琐的TAG * 可以方便的 设置debug模式 发布时候 可以直接修改debug为false 就不会输出日志了* @author mathschild**/
public class LogUtil {/** * @Title: @LogUtil.java * @Description: 日志输出类 * @author Wang Shuhai* @email mathschild@126.com* @date @2014-9-20 @下午5:13:49* @version V1.0 *//*** 关闭日志输出*/private static boolean OPEN_LOG = true;/*** 关闭DEBUG日志输出*/private static boolean DEBUG = true;/*** TAG 名称*/ private static String tag = "[app]";private String mClassName;private static LogUtil log;private static final String USER_NAME = "@user@";private LogUtil(String name) {mClassName = name;}/*** Get The Current Function Name* * @return Name*/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;}public static void i(Object str) {print(Log.INFO, str);}public static void d(Object str) {print(Log.DEBUG, str);}public static void v(Object str) {print(Log.VERBOSE, str);}public static void w(Object str) {print(Log.WARN, str);}public static void e(Object str) {print(Log.ERROR, str);}/*** 用于区分不同接口数据 打印传入参数* @param index * @param str*/private static void print(int index, Object str) {if (!OPEN_LOG) {return;}if (log == null) {log = new LogUtil(USER_NAME);} String name = log.getFunctionName();if (name != null) {str = name + " - " + str;}//Close the debug log When DEBUG is false if(!DEBUG){if(index<=Log.DEBUG){return;}}switch (index) {case Log.VERBOSE:Log.v(tag, str.toString());break;case Log.DEBUG:Log.d(tag, str.toString());break;case Log.INFO:Log.i(tag, str.toString());break;case Log.WARN:Log.w(tag, str.toString());break;case Log.ERROR:Log.e(tag, str.toString());break;default:break;}}
}
开发经验总结(打造更优秀的日志输出工具类)相关推荐
- 10个优秀的日志分析工具
在网络管理员的日常工作中,对日志文件的分析能够及时了解网络设备或应用的性能数据,以便及时发现问题并及时解决.分析日志文件的时候需要运用到日志分析工具,接下来就给大家分享10个优秀的日志分析工具: 1. ...
- 新手必需知道的10个优秀的日志分析工具
在网络管理员的日常工作中,对日志文件的分析能够及时了解网络设备或应用的性能数据,以便及时发现问题并及时解决.分析日志文件的时候需要运用到日志分析工具,接下来就给大家分享10个优秀的日志分析工具: 1. ...
- 一个好用的日志管理工具类MyLogger
日志的规范管理,在项目中不容忽视,应用上线后将调试日志关闭也是十分必要的,下面就是一个好用的日志管理工具类(点击下载): import java.util.Hashtable;import andro ...
- unity 如何获取到屏幕中间_Unity通用渲染管线Shader日志输出工具
这是侑虎科技第700篇文章,感谢作者邹春毅供稿.欢迎转发分享,未经作者授权请勿转载.如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群:793972859) 作者主页:https://w ...
- 在logback、log4j等日志输出工具中输出java异常调用堆栈
使用logback.log2j输出java异常如果采用如下方式: try{...}catch (Exception e){logger.error("[lid:{}] [{}]<< ...
- 一个错误日志记录工具类
package com.moxiu.downloader.util;/*** 当程序发生Uncaught异常的时候,有该类来接管程序,并记录错误日志* Created by ZGP on 2017/7 ...
- Qt5之 简单的日志记录工具类
qt5 自己做的一个读写 sqlite3 的数据工具,能打开sqlite3格式的数据库文件 地址:https://blog.csdn.net/HK_5788/article/details/80963 ...
- Java分布式唯一ID生成方案——比UUID效率更高的生成id工具类
package com.xinyartech.erp.core.util;import java.lang.management.ManagementFactory; import java.net. ...
- Mybatis指定日志输出实现
10 Mybatis指定日志输出实现 在程序开发过程中,为了调试方便.了解程序的运行过程,进行必要的日志输出总是免不了的.对于使用Mybatis而言,我们常见的需求是希望可以在 ...
最新文章
- Apache+PHP+MySQL安装与配置
- 读《构建之法》第 8、9、10 章有感
- mysql 的 sql 执行计划详解
- pycharm新建python file没有默认头_Pycharm 设置默认头的图文教程
- python拆分excel的sheet为单文件_pandas处理excel一个sheet拆分为多个sheet
- Selenium Web 自动化 - 项目实战(三)
- Python 元组拆包
- IDEA报错 com.microsoft.sqlserver.jdbc.SQLServerException : 列名或所提供的数目与表定于不匹配
- CTF古典密码:移位密码
- IDM(PC端下载) -Chrome浏览器插件
- IIS搭建本地服务器,花生壳实现外网通过域名访问网站
- 计算机组成和导论,计算机科学导论五第章计算机组成
- 程序界的高手传奇(转)
- Pytorch——XLNet 预训练模型及命名实体识别
- CIIP是基于XAF开发的开源信息系统框架
- 交叉引用跳转不到后面_参考文献如何正确标注引用而不会变红?
- icoud邮箱无法连接服务器,适用于 iCloud 电子邮件客户端的邮件服务器设置
- MIPI-DSI/CSI协议介绍
- 什么是BSD开源协议
- 手机端-上传头像并裁剪