羊皮书APP (Android版)开发系列(二)日志工具类
来源:互联网 发布:淘宝买家信誉显示7心 编辑:程序博客网 时间:2024/05/22 03:37
在App开发过程中,很重要的一个调试工具就是日志的打印,Android系统自带的日志打印文件,看起来并不是很直观。这里我们自己对原生Android 日志做一个封装,方便我们使用。
- 为了更方便,更简洁,将日志文件工具命名为L.java,代码如下:
package cn.studyou.parchment.log;import android.text.TextUtils;import android.util.Log;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.io.File;/** * 基本功能:记录日志 * 创建:王杰 * 创建时间:16/3/7 * 邮箱:w489657152@gmail.com */public class L { private static boolean IS_SHOW_LOG = true; private static final String DEFAULT_MESSAGE = "execute"; private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private static final int JSON_INDENT = 4; private static final int V = 0x1; private static final int D = 0x2; private static final int I = 0x3; private static final int W = 0x4; private static final int E = 0x5; private static final int A = 0x6; private static final int JSON = 0x7; private static final int FILE = 0x8; public static void init(boolean isShowLog) { IS_SHOW_LOG = isShowLog; } public static void v() { printLog(V, null, DEFAULT_MESSAGE); } public static void v(Object msg) { printLog(V, null, msg); } public static void v(String tag, String msg) { printLog(V, tag, msg); } public static void d() { printLog(D, null, DEFAULT_MESSAGE); } public static void d(Object msg) { printLog(D, null, msg); } public static void d(String tag, Object msg) { printLog(D, tag, msg); } public static void i() { printLog(I, null, DEFAULT_MESSAGE); } public static void i(Object msg) { printLog(I, null, msg); } public static void i(String tag, Object msg) { printLog(I, tag, msg); } public static void w() { printLog(W, null, DEFAULT_MESSAGE); } public static void w(Object msg) { printLog(W, null, msg); } public static void w(String tag, Object msg) { printLog(W, tag, msg); } public static void e() { printLog(E, null, DEFAULT_MESSAGE); } public static void e(Object msg) { printLog(E, null, msg); } public static void e(String tag, Object msg) { printLog(E, tag, msg); } public static void a() { printLog(A, null, DEFAULT_MESSAGE); } public static void a(Object msg) { printLog(A, null, msg); } public static void a(String tag, Object msg) { printLog(A, tag, msg); } public static void json(String jsonFormat) { printLog(JSON, null, jsonFormat); } public static void json(String tag, String jsonFormat) { printLog(JSON, tag, jsonFormat); } public static void file(File targetDirectory, Object msg) { printFile(null, targetDirectory, null, msg); } public static void file(String tag, File targetDirectory, Object msg) { printFile(tag, targetDirectory, null, msg); } public static void file(String tag, File targetDirectory, String fileName, Object msg) { printFile(tag, targetDirectory, fileName, msg); } private static void printLog(int type, String tagStr, Object objectMsg) { if (!IS_SHOW_LOG) { return; } StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); int index = 4; String className = stackTrace[index].getFileName(); String methodName = stackTrace[index].getMethodName(); int lineNumber = stackTrace[index].getLineNumber(); String tag = (tagStr == null ? className : tagStr); String methodNameShort = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("[ (").append(className).append(":").append(lineNumber).append(")#").append(methodNameShort).append(" ] "); String msg = (objectMsg == null) ? "Log with null Object" : objectMsg.toString(); if (msg != null && type != JSON) { stringBuilder.append(msg); } String logStr = stringBuilder.toString(); switch (type) { case V: case D: case I: case W: case E: case A: printLog(type, tag, logStr); break; case JSON: { if (TextUtils.isEmpty(msg)) { Log.e(tag, "Empty or Null json content"); return; } printJson(tag, msg, logStr); } break; } } private static void printLog(int type, String tag, String logStr) { switch (type) { case V: Log.v(tag, logStr); break; case D: Log.d(tag, logStr); break; case I: Log.i(tag, logStr); break; case W: Log.w(tag, logStr); break; case E: Log.e(tag, logStr); break; case A: Log.wtf(tag, logStr); break; } } private static void printJson(String tag, String msg, String logStr) { String message = null; try { if (msg.startsWith("{")) { JSONObject jsonObject = new JSONObject(msg); message = jsonObject.toString(JSON_INDENT); } else if (msg.startsWith("[")) { JSONArray jsonArray = new JSONArray(msg); message = jsonArray.toString(JSON_INDENT); } } catch (JSONException e) { e(tag, e.getCause().getMessage() + "\n" + msg); return; } printLine(tag, true); message = logStr + LINE_SEPARATOR + message; String[] lines = message.split(LINE_SEPARATOR); StringBuilder jsonContent = new StringBuilder(); for (String line : lines) { jsonContent.append("║ ").append(line).append(LINE_SEPARATOR); } Log.d(tag, jsonContent.toString()); printLine(tag, false); } private static void printFile(String tag, File targetDirectory, String fileName, Object objectMsg) { if (!IS_SHOW_LOG) { return; } StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); int index = 4; String className = stackTrace[index].getFileName(); String methodName = stackTrace[index].getMethodName(); int lineNumber = stackTrace[index].getLineNumber(); tag = (tag == null ? className : tag); String methodNameShort = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("[ (").append(className).append(":").append(lineNumber).append(")#").append(methodNameShort).append(" ] "); String msg = (objectMsg == null) ? "Log with null Object" : objectMsg.toString(); String headString = stringBuilder.toString(); if (msg != null) { msg = headString + msg; } fileName = (fileName == null) ? FileHelper.getFileName() : fileName; if (FileHelper.save(targetDirectory, fileName, msg)) { Log.d(tag, headString + " save log success ! location is >>>" + targetDirectory.getAbsolutePath() + "/" + fileName); } else { Log.e(tag, headString + "save log fails !"); } } private static void printLine(String tag, boolean isTop) { if (isTop) { Log.d(tag, "╔═══════════════════════════════════════════════════════════════════════════════════════"); } else { Log.d(tag, "╚═══════════════════════════════════════════════════════════════════════════════════════"); } }}
- FileHelper.java 代码如下:
package cn.studyou.parchment.log;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.util.Random;/** * 基本功能:FileHelper * 创建:王杰 * 创建时间:16/3/7 * 邮箱:w489657152@gmail.com */public class FileHelper { public static boolean save(File dic, String fileName, String msg) { File file = new File(dic, fileName); try { OutputStream outputStream = new FileOutputStream(file); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); outputStreamWriter.write(msg); outputStreamWriter.flush(); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); return false; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } return true; } public static String getFileName() { Random random = new Random(); StringBuilder stringBuilder = new StringBuilder("KLog_"); stringBuilder.append(Long.toString(System.currentTimeMillis()+random.nextInt(10000)).substring(4)); stringBuilder.append(".txt"); return stringBuilder.toString(); }}
这个日志工具只有以上两个文件,那么我们如何使用这个日志工具呢?很简答。
- 首先在APP的Application文件中设置debug开关:
public static final boolean DEVELOPER_MODE = true;
- 其次在OnCreate方法中进行初始化:
@Override public void onCreate() { super.onCreate(); //初始化日志工具 L.init(DEVELOPER_MODE); }
- 到这里初始化就完成了,在我们的java文件中使用这个日志工具L:
L.e("First start!"); L.i("First start!"); L.a("First start!");
- 控制台显示结果:
03-07 13:37:59.470 14633-14633/cn.studyou.parchment E/StartUpActivity.java: [ (StartUpActivity.java:24)#OnCreate ] First start!03-07 13:37:59.470 14633-14633/cn.studyou.parchment I/StartUpActivity.java: [ (StartUpActivity.java:26)#OnCreate ] First start!03-07 13:37:59.470 14633-14633/cn.studyou.parchment A/StartUpActivity.java: [ (StartUpActivity.java:27)#OnCreate ] First start!
- 点击控制台超链接StartUpActivity.java:24即可直接定位到日志的具体位置。是不是很简单呢?赶紧试试吧!
- 原文地址:http://blog.csdn.net/wjwj1203/article/details/50832631
- 我的github地址:https://github.com/wjie2014
- 我的博客地址:http://blog.studyou.cn/
- 我的CSDN博客地址:http://blog.csdn.net/wjwj1203
- 我的Gmail邮箱:w489657152@gmail.com
0 0
- 羊皮书APP (Android版)开发系列(二)日志工具类
- 羊皮书APP(Android版)开发系列(六)几个工具的选取
- 羊皮书APP(Android版)开发系列(十)Android开发常用工具类
- 羊皮书APP(Android版)开发系列(三)APP引导页启动控制
- 羊皮书APP(Android版)开发系列(五)APP引导页实现
- 羊皮书APP(Android版)开发系列(七)Android沉浸通知栏
- 羊皮书APP(Android版)开发系列(十二)Android Socket UDP大文件传输
- 羊皮书APP(Android版)开发系列(十三)Android 邮件发送的实现
- 羊皮书APP(Android版)开发系列(一)Icon图片生成神器
- 羊皮书APP(Android版)开发系列(四)全屏幕延迟启动
- 羊皮书APP(Android版)开发系列(八)用户登录
- 羊皮书APP(Android版)开发系列(九)通过Wifi调试程序
- 羊皮书APP(Android版)开发系列(十一)客户端与服务器端时间校准
- 日志工具类(二)
- Android开发系列(二)
- android开发------------------Log日志工具类(LogUtils)
- Android开发之App Widget(二)
- 基于Bmob的Android资讯类app开发(二)
- C# 新建excel
- EasyUI-Tree
- MD5算法原理
- python之os模块
- lzg_ad:XPE中的EWF分区设置说明
- 羊皮书APP (Android版)开发系列(二)日志工具类
- 策略模式(1)
- HUST 1602 - Substring
- Import Projects
- 用Maven创建第一个web项目
- 记忆化搜索——地宫取宝
- ping+telnet
- 关于path_alloc 函数(APUE)
- 数据库操作