Android開源日誌庫Logger的使用,日誌重復打印、無法對齊問題。
阿新 • • 發佈:2018-11-29
數量 線程 日誌輸出 分析 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的使用,日誌重復打印、無法對齊問題。