天天看點

Log架構之Logger

是什麼?

  • 是一個簡單,漂亮,強大的Android開源日志工具,代碼托管在github上 https://github.com/orhanobut/logger

有何特點?

  • 能夠提供:
    1. 線程資訊:log在哪個線程
    2. 類資訊:log在哪個類
    3. 方法資訊:log在哪個方法的哪一行
    4. 漂亮地列印json
    5. 漂亮的換行分割
    6. 整潔的輸出
    7. 跳轉到源代碼

為什麼用它?

  1. 預設實作是對于android.util.Log的封裝
  2. 彌補了“android的logcat的message有字元長度的限制,超過将直接截斷”的缺陷
  3. 支援參數添加占位符來格式化字元串,

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

  4. 支援直接列印List,Set,Map,數組類型等引用類型
  5. 指定任意TAG
  6. 配置初始化選項
  7. 支援自定義CustomLogAdapter實作LogAdapter,替換android.util.Log

怎麼使用?

1. 配置初始化選項(可選操作,不配置會提供預設配置)

Logger
  .init("mytag")                 // default PRETTYLOGGER or use just init()
  .methodCount()                 // default 2
  .hideThreadInfo()               // default shown
  .logLevel(LogLevel.NONE)        // default LogLevel.FULL
  .methodOffset()                // default 0
  .logAdapter(new AndroidLogAdapter()); //default AndroidLogAdapter
}
           

注:以上任一配置項都是可選的,可以根據需求組合。最好是在Application的onCreate()裡面配置。

預設配置下,

Logger.d("hello");

效果如下:

Log架構之Logger
  • 最上面的區域顯示線程資訊:Thread:main表示是在主線程。通過設定

    Logger.hideThreadInfo()

    可以隐藏該區域;
  • 中間的區域顯示類和方法資訊:按方法調用棧的順序列印,可以看出

    MainActivity

    onCreate

    方法調用了

    method2

    方法,後者執行了

    Logger.d("hello");

    ,并且

    Logger.d("hello");

    位于

    MainActivity

    類的第73行,滑鼠左鍵單擊藍色連結,就能跳轉到

    Logger.d("hello");

    處于源代碼中的位置。

    Logger.methodCount(int)

    決定列印多少行(每一行代表一個方法),設定

    Logger.methodCount(3)

    效果為:
    Log架構之Logger

    Logger.logLevel(LogLevel)

    設定日志等級,

    LogLevel.FULL

    列印所有日志,

    LogLevel.NONE

    不列印日志,釋出正式版本應該用

    LogLevel.NONE

    Logger.methodOffset(int)

    設定方法的偏移量,設定

    Logger.methodOffset(1)

    效果為:
    Log架構之Logger
    設定

    Logger.methodOffset(-1)

    效果為:
    Log架構之Logger

    Logger.logAdapter(LogAdapter)

    設定log最終的列印邏輯,預設是

    AndroidLogAdapter

    ,源碼如下:
package com.orhanobut.logger;

import android.util.Log;

class AndroidLogAdapter implements LogAdapter {
  @Override public void d(String tag, String message) {
    Log.d(tag, message);
  }

  @Override public void e(String tag, String message) {
    Log.e(tag, message);
  }

  @Override public void w(String tag, String message) {
    Log.w(tag, message);
  }

  @Override public void i(String tag, String message) {
    Log.i(tag, message);
  }

  @Override public void v(String tag, String message) {
    Log.v(tag, message);
  }

  @Override public void wtf(String tag, String message) {
    Log.wtf(tag, message);
  }
}
           
  • 最下面的區域顯示log的最重要部分:message

2. 列印不同級别的log

Logger.v(String message); // VERBOSE級别,可添加占位符
Logger.d(Object object); // DEBUG級别,列印對象
Logger.d(String message); // DEBUG級别,可添加占位符
Logger.i(String message); // INFO級别,可添加占位符
Logger.w(String message); // WARN級别,可添加占位符
Logger.e(String message); // ERROR級别,可添加占位符
Logger.e(Throwable throwable, String message); // ERROR級别,可添加占位符
Logger.wtf(String message); // ASSERT級别,可添加占位符

// 一個綜合方法,level可取Logger.VERBOSE...Logger.ASSERT
Logger.log(int level, String tag, String message, Throwable throwable);

String xml = "<note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>";
Logger.xml(xml); // 列印xml

String json = "{" +
        "\"employees\": [" +
        "{ \"firstName\":\"Bill\" , \"lastName\":\"Gates\" }," +
        "{ \"firstName\":\"George\" , \"lastName\":\"Bush\" }," +
        "{ \"firstName\":\"Thomas\" , \"lastName\":\"Carter\" }" +
        "]" +
        "}";

Logger.json(json); // 列印json
           

3.列印List,Set,Map,數組類型

Logger.d(Object object);
           

4.指定TAG

Logger.init(String tag);
Logger.t(String tag);
Logger.t(String tag, int methodCount); 
           

5.通過占位符格式化字元串

Logger.d("hello %s %d", "world", ); // 占位符的使用,列印“hello world ”