日志工具类
2015-12-20 21:58
267 查看
概述:
在日常开发中,日志的打印对我们项目开发有着非常重要的作用,例如分debug版、上线版,但是上线版又不想打印部分日志,这时候就需要写一个日志工具类,来控制整个项目的打印了开发类:
日志接口(IPrinter):主要编写可以被外部调用接口,以及可以操作的类型。日志操作类(LogUtils):日志操作类(对外公开直接调用),直接调用日志输入类方法。
代码实现(Java)
package com.app.tools.log; /** * 打印日志方法接口 */ public interface IPrinter { /** 格式化Json格式数据,并打印 */ // void json(boolean isPrint, String json); /** 格式化xml格式数据,并打印 */ // void xml(boolean isPrint, String xml); // ============== 使用默认状态打印 ============== /** Log.DEBUG */ void d(String message, Object... args); /** Log.ERROR */ void e(String message, Object... args); /** Log.ERROR,并且输出错误信息Throwable */ void e(Throwable throwable, String message, Object... args); /** Log.WARN */ void w(String message, Object... args); /** Log.INFO */ void i(String message, Object... args); /** Log.VERBOSE */ void v(String message, Object... args); /** Log.ASSERT */ void wtf(String message, Object... args); // =-----------------= /** Log.DEBUG */ void d(String tag, String message, Object... args); /** Log.ERROR */ void e(String tag, String message, Object... args); /** Log.ERROR,并且输出错误信息Throwable */ void e(String tag, Throwable throwable, String message, Object... args); /** Log.WARN */ void w(String tag, String message, Object... args); /** Log.INFO */ void i(String tag, String message, Object... args); /** Log.VERBOSE */ void v(String tag, String message, Object... args); /** Log.ASSERT */ void wtf(String tag, String message, Object... args); // ============== 存在 isPrint 特殊情况是否需要打印 ============== /** Log.DEBUG */ void d(boolean isPrint, String message, Object... args); /** Log.ERROR */ void e(boolean isPrint, String message, Object... args); /** Log.ERROR,并且输出错误信息Throwable */ void e(boolean isPrint, Throwable throwable, String message, Object... args); /** Log.WARN */ void w(boolean isPrint, String message, Object... args); /** Log.INFO */ void i(boolean isPrint, String message, Object... args); /** Log.VERBOSE */ void v(boolean isPrint, String message, Object... args); /** Log.ASSERT */ void wtf(boolean isPrint, String message, Object... args); // =-----------------= /** Log.DEBUG */ void d(boolean isPrint, String tag, String message, Object... args); /** Log.ERROR */ void e(boolean isPrint, String tag, String message, Object... args); /** Log.ERROR,并且输出错误信息Throwable */ void e(boolean isPrint, String tag, Throwable throwable, String message, Object... args); /** Log.WARN */ void w(boolean isPrint, String tag, String message, Object... args); /** Log.INFO */ void i(boolean isPrint, String tag, String message, Object... args); /** Log.VERBOSE */ void v(boolean isPrint, String tag, String message, Object... args); /** Log.ASSERT */ void wtf(boolean isPrint, String tag, String message, Object... args); // =-----------------= /** Log.ERROR,并且输出错误信息Throwable */ void e(Throwable throwable); /** Log.ERROR,并且输出错误信息Throwable */ void e(String tag, Throwable throwable); /** Log.ERROR,并且输出错误信息Throwable */ void e(boolean isPrint, String tag, Throwable throwable); }
package com.app.tools.log; import android.util.Log; /** * 日志工具类 */ public enum LogUtils implements IPrinter { INSTANCE; /** 是否打印日志 上线 = false,开发、debug = true*/ private final boolean JUDGE_PRINT_LOG = true; /** 特殊情况打印日志 - 如上线后,JUDGE_PRINT_LOG = false,但是有些异常还是需要打印,则在重要地方传入 true*/ public static final boolean PRING_LOG = true; /** 默认DEFAULT_TAG */ private final String DEFAULT_DEFAULT_TAG = "LogTools"; /** * 最终打印日志方法(全部调用此方法) * @param logType 打印日志类型 * @param tag 打印Tag * @param msg 打印消息 */ private static void printLog(int logType, String tag, String msg) { switch (logType) { case Log.ERROR: Log.e(tag, msg); break; case Log.INFO: Log.i(tag, msg); break; case Log.VERBOSE: Log.v(tag, msg); break; case Log.WARN: Log.w(tag, msg); break; case Log.ASSERT: Log.wtf(tag, msg); break; case Log.DEBUG: Log.d(tag, msg); break; default: Log.d(tag, msg); break; } } /** * 处理信息 * @param message 打印信息 * @param args 占位符替换 * @return */ private String createMessage(String message, Object... args) { String result = null; try { if(message != null){ if(args == null){ // 动态参数为null result = "params is null"; } else { // 格式化字符串 result = (args.length == 0 ? message : String.format(message, args)); } } else { // 打印内容为null result = "message is null"; } } catch (Exception e) { // 出现异常 result = e.toString(); } return result; } /** * 拼接错误信息 * @param throwable 错误异常 * @param message 需要打印的消息 * @param args 动态参数 * @return */ private String splitErrorMessage(Throwable throwable, String message, Object... args) { String result = null; try { if(throwable != null){ if(message != null){ result = createMessage(message, args) + " : " + throwable.toString(); } else { result = throwable.toString(); } } else { result = createMessage(message, args); } } catch (Exception e) { result = e.toString(); } return result; } // =================== 对外公开方法 ========================= // =-----------------= 使用默认状态打印 =-----------------= @Override public void d(String message, Object... args) { this.d(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, message, args); } @Override public void e(String message, Object... args) { this.e(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, message, args); } @Override public void e(Throwable throwable, String message, Object... args) { this.e(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, throwable, message, args); } @Override public void w(String message, Object... args) { this.w(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, message, args); } @Override public void i(String message, Object... args) { this.i(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, message, args); } @Override public void v(String message, Object... args) { this.v(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, message, args); } @Override public void wtf(String message, Object... args) { this.wtf(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, message, args); } // =-----------------= @Override public void d(String tag, String message, Object... args) { this.d(JUDGE_PRINT_LOG, tag, message, args); } @Override public void e(String tag, String message, Object... args) { this.e(JUDGE_PRINT_LOG, tag, message, args); } @Override public void e(String tag, Throwable throwable, String message, Object... args) { this.d(JUDGE_PRINT_LOG, tag, throwable, message, args); } @Override public void w(String tag, String message, Object... args) { this.w(JUDGE_PRINT_LOG, tag, message, args); } @Override public void i(String tag, String message, Object... args) { this.i(JUDGE_PRINT_LOG, tag, message, args); } @Override public void v(String tag, String message, Object... args) { this.v(JUDGE_PRINT_LOG, tag, message, args); } @Override public void wtf(String tag, String message, Object... args) { this.wtf(JUDGE_PRINT_LOG, tag, message, args); } // ============== 存在 isPrint 特殊情况是否需要打印 ============== @Override public void d(boolean isPrint, String message, Object... args) { this.d(isPrint, DEFAULT_DEFAULT_TAG, message, args); } @Override public void e(boolean isPrint, String message, Object... args) { this.e(isPrint, DEFAULT_DEFAULT_TAG, message, args); } @Override public void e(boolean isPrint, Throwable throwable, String message, Object... args) { this.e(isPrint, DEFAULT_DEFAULT_TAG, throwable, message, args); } @Override public void w(boolean isPrint, String message, Object... args) { this.w(isPrint, DEFAULT_DEFAULT_TAG, message, args); } @Override public void i(boolean isPrint, String message, Object... args) { this.i(isPrint, DEFAULT_DEFAULT_TAG, message, args); } @Override public void v(boolean isPrint, String message, Object... args) { this.v(isPrint, DEFAULT_DEFAULT_TAG, message, args); } @Override public void wtf(boolean isPrint, String message, Object... args) { this.wtf(isPrint, DEFAULT_DEFAULT_TAG, message, args); } // =-----------------= 最终都是调用这里 =-----------------= @Override public void d(boolean isPrint, String tag, String message, Object... args) { if(isPrint){ printLog(Log.DEBUG, tag, createMessage(message, args)); } } @Override public void e(boolean isPrint, String tag, String message, Object... args) { if(isPrint){ printLog(Log.ERROR, tag, createMessage(message, args)); } } @Override public void e(boolean isPrint, String tag, Throwable throwable, String message, Object... args) { if(isPrint){ printLog(Log.ERROR, tag, splitErrorMessage(throwable, message, args)); } } @Override public void w(boolean isPrint, String tag, String message, Object... args) { if(isPrint){ printLog(Log.WARN, tag, createMessage(message, args)); } } @Override public void i(boolean isPrint, String tag, String message, Object... args) { if(isPrint){ printLog(Log.INFO, tag, createMessage(message, args)); } } @Override public void v(boolean isPrint, String tag, String message, Object... args) { if(isPrint){ printLog(Log.VERBOSE, tag, createMessage(message, args)); } } @Override public void wtf(boolean isPrint, String tag, String message, Object... args) { if(isPrint){ printLog(Log.ASSERT, tag, createMessage(message, args)); } } // =-----------------= @Override public void e(Throwable throwable){ this.e(JUDGE_PRINT_LOG, DEFAULT_DEFAULT_TAG, throwable); } @Override public void e(String tag, Throwable throwable) { this.e(JUDGE_PRINT_LOG, tag, throwable); } @Override public void e(boolean isPrint, String tag, Throwable throwable) { if(isPrint){ printLog(Log.ERROR, tag, splitErrorMessage(throwable, null)); } } }
使用方法:
首先需要理解接口调用方法,就很容易明白如何使用一共有4种类型 (Error除外,只是多了Throwable参数)
1. void xxx (String message, Object… args);
2. void xxx (String tag, String message, Object… args);
3. void xxx (boolean isPrint, String message, Object… args);
4. void xxx (boolean isPrint, String tag, String message, Object… args);
isPrint 表示是否输出日志
tag 表示输出日志的Tag,可以在logcat监听
message 表示输入的信息
Object… 主要是格式化字符串
例如message = 测试打印:%s 和%s , Object.. = new Object []{“1”,”2”};
结果等于 = 测试打印:1和2
package com.app.tools.log; /** * 日志使用方法 */ public final class LogHint { // 日志类 在 com.app.tools.log 包下 // ==-------------------------------== // IPrinter.java -> 属于日志接口 主要写可调用的日志输出方法 // ==-------------------------------== // LogUtils.java -> 属于单例模式日志工具类,日志的输出全通过该类 // LogUtils.java -> 有三个重要的变量 // =-= 1.如果上线版则设置 JUDGE_PRINT_LOG = false; /** 是否打印日志 上线 = false,开发、debug = true */ /** private final boolean JUDGE_PRINT_LOG = true; */ // =-= 2.PRING_LOG 该变量无需管理,为默认使用参数 /** 特殊情况打印日志 - 如上线后,JUDGE_PRINT_LOG = false,但是有些异常还是需要打印,则在重要地方传入 true */ /** public static final boolean PRING_LOG = true; */ // =-= 3.该参数为默认Tag,例如有些日志输出,可以默认使用 Qlippie_Log,不传入TAG /** 默认DEFAULT_TAG */ /** private final String DEFAULT_DEFAULT_TAG = "Qlippie_Log"; */ // ========================= 使用方式 =============================== protected void logUse() { // 日志输出都通过 LogUtils.INSTANCE 来调用 // 正常输出,非重要信息(跟随 JUDGE_PRINT_LOG 状态,如果上线版则不输出日志) // 以下使用的是 默认Tag => Qlippie_Log LogUtils.INSTANCE.d("输出例子1.0"); LogUtils.INSTANCE.d("输出例子2.0 %s", new Object[]{"格式化字符串"}); // 以下使用的是 自定义Tag(同样跟随 JUDGE_PRINT_LOG 状态) LogUtils.INSTANCE.d("LogActivity","输出例子1.0"); LogUtils.INSTANCE.d("MainActivity","输出例子2.0 %s", new Object[]{"格式化字符串"}); // 某些重要情况下,就算是上线版本也输出,则调用以下方法 ,传入true 表示不管上线,debug版本,都输出日志 LogUtils.INSTANCE.d(true,"输出例子1.0"); LogUtils.INSTANCE.d(LogUtils.PRING_LOG,"输出例子2.0 %s", new Object[]{"格式化字符串"}); // 同上,属于自定义Tag LogUtils.INSTANCE.d(true,"LogActivity","输出例子1.0"); LogUtils.INSTANCE.d(LogUtils.PRING_LOG,"MainActivity","输出例子2.0 %s", new Object[]{"格式化字符串"}); // =============== // 异常错误信息,输出 // =============== // 模拟异常对象(try - catch,中输出) Exception exception = new Exception(); // 直接输出错误信息,跟随 JUDGE_PRINT_LOG 状态,默认Tag LogUtils.INSTANCE.e(exception); // 跟随 JUDGE_PRINT_LOG 状态,默认Tag LogUtils.INSTANCE.e("输出例子1.0"); LogUtils.INSTANCE.e("输出例子2.0 %s", new Object[]{"格式化字符串"}); // 单独自定义Tag 跟随 JUDGE_PRINT_LOG 状态 LogUtils.INSTANCE.e("LogActivity", exception,"输出例子1.0"); LogUtils.INSTANCE.e("LogActivity", exception,"输出例子2.0 %s", new Object[]{"格式化字符串"}); // 某些重要情况下,就算是上线版本也输出,则调用以下方法 ,传入true 表示不管上线,debug版本,都输出日志 LogUtils.INSTANCE.e(true,"输出例子1.0"); LogUtils.INSTANCE.e(LogUtils.PRING_LOG,"输出例子2.0 %s", new Object[]{"格式化字符串"}); // 同上,属于自定义Tag LogUtils.INSTANCE.e(true,"LogActivity","输出例子1.0"); LogUtils.INSTANCE.e(LogUtils.PRING_LOG,"MainActivity","输出例子2.0 %s", new Object[]{"格式化字符串"}); // 自定义Tag , 不跟随状态,直接输出,拼接异常与message,并格式化字符串 LogUtils.INSTANCE.e(true,"LogActivity", exception,"输出例子1.0"); LogUtils.INSTANCE.e(LogUtils.PRING_LOG,"LogActivity", exception,"输出例子2.0 %s", new Object[]{"格式化字符串"}); } }
代码下载
Android日志工具类 Logger - 356KB相关文章推荐
- MySQL Server 日志
- MSSQL 2005 LOG备份webshell的方法
- 使用MySQL Slow Log来解决MySQL CPU占用高的问题
- 清理SQL Server 2008日志文件Cannot shrink log file 2 的解决方案
- Android系统开发中log的使用方法及简单的原理
- android杂记:C++文件的添加log方法分享
- 提取oralce当天的alert log的shell脚本代码
- mysql正确安全清空在线慢查询日志slow log的流程分享
- PHP error_log()将错误信息写入一个文件(定义和用法)
- Apache启动错误Permission denied: httpd: could not open error log file解决方法
- Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
- PHP如何将log信息写入服务器中的log文件
- SQL Server中减小Log文件尺寸的方法分享
- Python中使用logging模块打印log日志详解
- python根据文件大小打log日志
- Android将应用调试log信息保存在SD卡的方法
- Hadoop配置常见Log错误指导
- BIND(三)—— DNS工具和BIND日志.md
- 系统开发之日志规划
- Django滚动logger