您的位置:首页 > 其它

日志工具类

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息