羊皮书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
原创粉丝点击