在日常开发中肯定少不了和log打交道回想一下我们是怎么使用 Log 的:先定义一个静态常量 TAG,TAG 的值通常是当前类的类名,然后在需要打印 Log 的地方,调用 Log.d(TAG, “要打印的内容”)。每次新写一个类,都要写一个 TAG,这也就算了,最苦逼的是,项目一上线,还要手动去把每个 Log 注释掉

logger提供的功能 线程的信息 类的信息 方法信息 将json文本人性化输出 简洁的输出 从日志跳转到源码

打印的类型

支持json xml 等格式的数据

  1. private String JSON_CONTENT = "{\"weatherinfo\":{\"city\":\"北京\",\"cityid\":\"101010100\"," +
  2. "\"temp\":\"18\",\"WD\":\"东南风\",\"WS\":\"1级\",\"SD\":\"17%\",\"WSE\":\"1\"," +
  3. "\"time\":\"17:05\",\"isRadar\":\"1\",\"Radar\":\"JC_RADAR_AZ9010_JB\"," +
  4. "\"njd\":\"暂无实况\",\"qy\":\"1011\",\"rain\":\"0\"}}";
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. Logger.json(JSON_CONTENT);
  10. }
  1. private String XML_CONTENT = "<china dn=\"nay\"><city quName=\"黑龙江\" pyName=\"heilongjiang\" " +
  2. "cityname=\"哈尔滨\" state1=\"1\" state2=\"1\" stateDetailed=\"多云\"/><city quName=\"吉林\"" +
  3. " pyName=\"jilin\" " +
  4. "cityname=\"长春\" state1=\"0\" state2=\"0\" stateDetailed=\"晴\"/><city quName=\"辽宁\" " +
  5. "pyName=\"liaoning\" " +
  6. "cityname=\"沈阳\" state1=\"1\" state2=\"0\" stateDetailed=\"多云转晴\"/><city " +
  7. "quName=\"海南\" pyName=\"hainan\" " +
  8. "cityname=\"海口\" state1=\"22\" state2=\"21\" stateDetailed=\"中到大雨转小到中雨\"/></china>";
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. Logger.xml(XML_CONTENT);
  14. }
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. // List 类型数据
  6. List<String> list = new ArrayList<>();
  7. list.add("hello");
  8. list.add("world");
  9. Logger.d(list);
  10. }
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. // Map 类型数据
  6. Map<String, String> map = new HashMap<>();
  7. map.put("key_hello", "hello");
  8. map.put("key_world", "world");
  9. Logger.d(map);
  10. }
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. // Set 类型数据
  6. Set<String> set = new HashSet<>();
  7. set.add(new String("hello"));
  8. set.add(new String("world"));
  9. Logger.d(set);
  10. }
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. Logger.d("hello %s %d", "world", 5);
  6. }
  1. 如果你不满意默认的 TAG,也可以自己定义一个 TAG,只需要调用一次 Logger.init() 就行了。因为只需要调用一次,所以可以在 Application 中来完成 Logger 的初始化。
  2. 新建 MyApplication 继承 Application,代码如下:
  3. public class MyApplication extends Application {
  4. private static String TAG = "LoggerTest";
  5. @Override
  6. public void onCreate() {
  7. super.onCreate();
  8. Logger.init(TAG);
  9. }
  10. }
  1. 之前说了,日志只是开发的时候需要用到,等到项目上线就不能用了。Logger 当然也考虑到了这一点,通过设置 Logger.init(TAG).logLevel(LogLevel.NONE) 可以设置为不打印日志。logLevel() 方法默认的参数是 LogLevel.FULL,也就是打印全部日志。修改 MyApplication onCreate() 方法:
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. Logger.init(TAG).logLevel(LogLevel.NONE);
  6. }
  1. Logger 打印 Exception,可以很清晰的看到 Exception 信息,这里我们写一个数组越界异常:
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. int[] a = new int[3];
  7. try {
  8. a[4] = 3;
  9. } catch (Exception e) {
  10. Logger.e(e, "message");
  11. }
  12. }
  1. Logger.init(TAG)
  2. .methodCount(3) // 方法栈打印的个数,默认是 2
  3. .hideThreadInfo() // // 隐藏线程信息,默认显示
  4. .methodOffset(2) // 设置调用堆栈的函数偏移值,默认是 0
  5. .logAdapter(new AndroidLogAdapter()); // 自定义一个打印适配器