日志工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BlogRecord/article/details/50365941

概述:


在日常开发中,日志的打印对我们项目开发有着非常重要的作用,例如分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

猜你喜欢

转载自blog.csdn.net/BlogRecord/article/details/50365941