1. 程式人生 > >Android開源日誌庫Logger的使用,日誌重復打印、無法對齊問題。

Android開源日誌庫Logger的使用,日誌重復打印、無法對齊問題。

數量 線程 日誌輸出 分析 format show 打印 studio 重寫

基於 com.orhanobut:logger:2.2.0

Logger的GitHub地址:https://github.com/orhanobut/logger

1.添加依賴

implementation ‘com.orhanobut:logger:2.2.0‘

2.初始化

Logger.addLogAdapter(new AndroidLogAdapter());

或者

FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
        .showThreadInfo(true)   // (可選) 是否顯示線程信息。Default:true
.methodCount(1)      // (可選) 顯示的方法數量。Default:2 .methodOffset(0)       // (可選) 隱藏的方法數量,若設為 1,則隱藏跳轉到日誌輸出的方法。Default:0 // .logStrategy(customLog)  // (可選) 更改日誌策略以打印輸出。Default:new LogcatLogStrategy()。AS3.0會出現日誌無法對齊的問題,下文有解決方法。 // .tag("My custom tag")    // (可選) 每個日誌的全局標記. Default:PRETTY_LOGGER
.build();   Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy){   // 日誌適配器通過檢查此函數來檢查日誌是否應該打印。如果要禁用/隱藏輸出日誌,請重寫isLoggable方法。true將打印日誌消息,false會忽略它。 @Override public boolean isLoggable(int priority, String tag) { return BuildConfig.DEBUG; } });

註意:應放到application中初始化。為了保證僅初始化一次LogAdapter,一個LogAdapter便不會重復輸出日誌。分析源碼得:

LogAdapter在集合中,每次初始化都會向集合中添加LogAdapter

public final class Logger {
    public static void addLogAdapter(@NonNull LogAdapter adapter) {
        printer.addAdapter(checkNotNull(adapter));
    }
}

public interface Printer {
    void addAdapter(@NonNull LogAdapter adapter);
}

class LoggerPrinter implements Printer {
    private final List<LogAdapter> logAdapters = new ArrayList<>();
    @Override public void addAdapter(@NonNull LogAdapter adapter) {
        logAdapters.add(checkNotNull(adapter));
    }
}

日誌輸出會遍歷LogAdapter集合,所以集合中有多少個LogAdapter就會輸出多少次。

class LoggerPrinter implements Printer {
    @Override public synchronized void log(int priority, @Nullable String tag, @Nullable String message, @Nullable Throwable throwable) {
        if (throwable != null && message != null) {
            message += " : " + Utils.getStackTraceString(throwable);
        }
        if (throwable != null && message == null) {
            message = Utils.getStackTraceString(throwable);
        }
        if (Utils.isEmpty(message)) {
            message = "Empty/NULL log message";
        }

        for (LogAdapter adapter : logAdapters) {
            if (adapter.isLoggable(priority, tag)) {
                adapter.log(priority, tag, message);
            }
        }
    }
}

技術分享圖片

3.使用

Logger.d("debug");
Logger.e("error");
Logger.w("warning");
Logger.v("verbose");
Logger.i("information");
Logger.wtf("What a Terrible Failure");

支持字符串格式參數:

Logger.d("hello %s", "world");

支持集合(僅可用於調試日誌):

Logger.d(MAP);
Logger.d(SET);
Logger.d(LIST);
Logger.d(ARRAY);

JSON和XML支持(輸出將處於調試級別):

Logger.json(JSON_CONTENT);
Logger.xml(XML_CONTENT);

效果展示:

技術分享圖片

將日誌保存到文件中,請參照官網。

Logger工作原理圖(來自GitHub):

技術分享圖片

解決在Android Studio 3.0以上的版本中Logger無法對齊的問題

/**
 * 自定義LogStrategy,解決AS3.0以上版本中日誌無法對齊的問題
 */
public class MyLogcatLogStrategy implements LogStrategy {
    @Override
    public void log(int priority, @Nullable String tag, @NonNull String message) {
        Log.println(priority, randomKey() + tag, message);
    }

    private int last;

    private String randomKey() {
        int random = (int) (10 * Math.random());
        if (random == last) {
            random = (random + 1) % 10;
        }
        last = random;
        return String.valueOf(random);
    }
}

// Logger 初始化時,將該類實例化,並設置到 LogStrategy 中
PrettyFormatStrategy strategy = PrettyFormatStrategy.newBuilder()
        .logStrategy(new LogCatStrategy())
        .tag("TAG")//(可選)這裏也可以設置全局TAG
        .build();
Logger.addLogAdapter(new AndroidLogAdapter(strategy));

Android開源日誌庫Logger的使用,日誌重復打印、無法對齊問題。