一個log工具類當然具備,開關log,獲取調用者信息,以及各種級別的log日誌,最最總要的是這個類只有一個字母,L,簡單方便好用
package com.flyaudio.flycodelibrary.utils;
import android.util.Log;
/**
* @author xingyunye
* @fileName L
* @createDate 2018/11/b 16:40
* @email [email protected]
* @desc Log工具
*/
public final class L {
public static final int RELEASE = 1;
public static final int DEBUG = 0;
/**
* 默認的TAG,建議後面加下劃線
*/
private static String DEFAULT_TAG = "tag_";
/**
* 日誌模式,默認爲debug
*/
private static int mode = DEBUG;
/**
* 防止實例
*/
private L() {
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* 設置log的模式
* @param logMode 只能爲L.RELEASE或L.DEBUG
*/
public static void setMode(final int logMode){
L.mode = logMode;
}
/**
* 設置全局默認的tag前綴,不設置的話默認爲tag_
* @param tag tag
*/
public static void setDefaultTag(String tag){
L.DEFAULT_TAG = tag;
}
/**
* 生成TAG
* @param o 對象object
* @return tag名,比如App_MainActivity
*/
public static String createTag(Object o) {
return o == null ? createTag() : DEFAULT_TAG + o.getClass().getSimpleName();
}
/**
* 生成默認TAG
* @return
*/
public static String createTag() {
return DEFAULT_TAG;
}
/**
* verbose 級別打印
* @param msg log信息
*/
public static void v(String msg) {
if (mode == DEBUG){
Log.v(DEFAULT_TAG, msg);
}
}
/**
* debug 級別打印
* @param msg log信息
*/
public static void d(String msg) {
if (mode == DEBUG){
Log.d(DEFAULT_TAG, msg);
}
}
/**
* info 級別打印
* @param msg log信息
*/
public static void i(String msg) {
if (mode == DEBUG){
Log.i(DEFAULT_TAG, msg);
}
}
/**
* warn 級別打印
* @param msg log信息
*/
public static void w(String msg) {
if (mode == DEBUG){
Log.w(DEFAULT_TAG, msg);
}
}
/**
* error 級別打印
* @param msg log信息
*/
public static void e(String msg) {
if (mode == DEBUG){
Log.e(DEFAULT_TAG, msg);
}
}
/**
* verbose 級別打印
* @param tag log 標籤
* @param msg log信息
*/
public static void v(String tag, String msg) {
if (mode == DEBUG){
Log.v(tag, msg);
}
}
/**
* debug 級別打印
* @param tag log 標籤
* @param msg log信息
*/
public static void d(String tag, String msg) {
if (mode == DEBUG){
Log.d(tag, msg);
}
}
/**
* info 級別打印
* @param tag log 標籤
* @param msg log信息
*/
public static void i(String tag, String msg) {
if (mode == DEBUG){
Log.i(tag, msg);
}
}
/**
* warn 級別打印
* @param tag log 標籤
* @param msg log信息
*/
public static void w(String tag, String msg) {
if (mode == DEBUG){
Log.w(tag, msg);
}
}
/**
* error 級別打印
* @param tag log 標籤
* @param msg log信息
*/
public static void e(String tag, String msg) {
if (mode == DEBUG){
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.e(tag, "(" + targetStackTraceElement.getFileName() + ":" + targetStackTraceElement.getLineNumber() + ")");
Log.e(tag, msg);
}
}
/**
* 用於打印可以忽略的信息,比如說被忽視的catch
*
* @param tag log 標籤
* @param msg log信息
*/
public static void ignore(String tag, String msg) {
if (mode == DEBUG){
Log.v(tag, "ignore_" + msg);
}
}
/**
* 找到調用者信息
* @return 調用者信息
*/
private static StackTraceElement getTargetStackTraceElement() {
// find the target invoked method
StackTraceElement targetStackTrace = null;
boolean shouldTrace = false;
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
boolean isLogMethod = stackTraceElement.getClassName().equals(L.class.getName())||stackTraceElement.getClassName().startsWith("java.lang");
if (shouldTrace && !isLogMethod) {
targetStackTrace = stackTraceElement;
break;
}
shouldTrace = isLogMethod;
}
return targetStackTrace;
}
}