SAF-Kotlin-log

Introduction: 完全基于 Kotlin 开发的 Android 日志框架,提供极简的 API
More: Author   ReportBugs   
Tags:

@Tony 沈哲 on weibo Download License

它是完全基于 Kotlin 开发的 Android 日志框架,提供极简的 API,能够打印出漂亮的日志格式。它基于最新的 Android Studio 版本、Kotlin 版本和 Gradle 版本构建。

下载安装

Gradle:

compile 'com.safframework.log:saf-log:1.5.5'

功能:

  • 支持自定义 tag
  • 支持多种日志级别
  • 打印的日志,除了可以显示日志内容之外,还能显示当前线程名称、在程序中所打印日志的位置
  • 支持自定义 Header
  • 基于责任链模式来打造对象的打印,将对象打印成 json 风格,方便阅读。默认支持 JSON 字符串、集合、Map、Bundle、Intent、Reference、Throwable、Uri 等类型的打印,分别做了特别的格式化处理。
  • 支持自定义对象的解析处理,将其打印成自己想要的风格。

使用方法:

它可以在任何使用 Java、Kotlin 开发的 Android 项目中使用。如果您的项目中只使用 Java,也无需额外添加 kotlin 的配置。

1.tag 使用

如果不考虑显示日志的 tag,可以直接使用,L 会提供默认的 tag。

String s = "abcd";
L.i(s);

如果需要使用 tag,可以在 Activity 的 onCreate()中添加如下的代码,类名则对应是 tag 的名称

L.init(this.getClass());

当然,init()除了支持传递 Class 对象,还支持传 String 对象。

2.日志级别

支持以下几种日志级别,除此之外还能将任何对象打印成 json 格式

方法名 作用
e() Error 级别打印日志
w() Warn 级别打印日志
i() Info 级别打印日志
d() Debug 级别打印日志
json() 将日志以 json 格式打印出来

还可以设置全局的日志级别,最好在 Application 中进行全局的配置。

java 中的使用方法:

L.setLogLevel(L.LogLevel.INFO);

kotlin 中的使用方法:

L.logLevel= L.LogLevel.INFO

3.打印日志

以 e、w、i、d 打印的日志风格如下:
第一行显示线程名
第二行显示类中打印的行数
第三行显示打印的具体内容

╔════════════════════════════════════════════════════════════════════════════════════════
║ Thread: main
╟────────────────────────────────────────────────────────────────────────────────────────
║ cn.salesuite.saf.aspects.TraceAspect.traceMethod  (TraceAspect.java:35)
╟────────────────────────────────────────────────────────────────────────────────────────
║ loadUser() take [14ms]
╚════════════════════════════════════════════════════════════════════════════════════════

json 方法的使用

Object obj = ...
L.json(obj);

4.支持各种对象类型的打印

多种对象类型都可以使用 json()方法打印成 json 风格。

4.1 将 List、Set 格式化打印

        User u = new User();
        u.userName = "tony";
        u.password = "123456";

        List<User> list = new ArrayList<>();
        list.add(u);
        list.add(u);
        L.json(list);

        List<String> ids = new ArrayList<>();
        ids.add("123");
        ids.add("456");
        L.json(ids);

        List<Double> idd = new ArrayList<>();
        idd.add(123D);
        idd.add(456D);
        L.json(idd);

打印效果:

4.2 将 Map 格式化打印

        User u = new User();
        u.userName = "tony";
        u.password = "123456";

        Map<String,User> map = new HashMap<>();
        map.put("tony",u);
        map.put("tt",u);
        L.json(map);

        Map<String,String> map2 = new HashMap<>();
        map2.put("tony","shen");
        map2.put("tt","ziyu");
        L.json(map2);

        Map<String,Boolean> map3 = new HashMap<>();
        map3.put("tony",true);
        map3.put("tt",false);
        L.json(map3);

打印效果:

4.3 将 JSON 字符串格式化打印

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

        L.json(jsonString);

打印效果:

4.4 将 Reference 格式化打印

        User u = new User();
        u.userName = "tony";
        u.password = "123456";

        L.json(new WeakReference<User>(u));

打印效果:

4.5 将 Throwable 格式化打印

L.json(new NullPointerException("this object is null"));

打印效果:

4.6 将 Bundle 格式化打印

        User u = new User();
        u.userName = "tony";
        u.password = "123456";

        Bundle bundle = new Bundle();
        bundle.putString("key1","this is key1");
        bundle.putInt("key2",100);
        bundle.putBoolean("key3",true);
        bundle.putSerializable("key4",u);
        L.json(bundle);

打印效果:

4.7 将 Intent 格式化打印

        User u = new User();
        u.userName = "tony";
        u.password = "123456";

        Bundle bundle = new Bundle();
        bundle.putString("key1","this is key1");
        bundle.putInt("key2",100);
        bundle.putBoolean("key3",true);
        bundle.putSerializable("key4",u);

        Intent i = new Intent(this,MainActivity.class);
        i.putExtras(bundle);
        L.json(i);

打印效果:

4.8 将 Uri 格式化打印

        Uri uri = Uri.parse("http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic");
        L.json(uri);

打印效果:

5.自定义 Header

我们公司之前的产品是做 deep link 以及移动端广告相关的 sdk。从开发这些产品中,我们获得的经验是日志里要是能够记录手机的一些信息,方便根据机型和操作系统版本来调试 bug 就好了。

由此产生了 L 的 Header。通常情况下,把手机的一些信息放入 Header 中,方便调试时一眼识别手机出的机型、操作系统版本号、App 版本号等等。一旦定义好 Header,所有使用 L 的日志上都会显示 Header 的内容。

6.针对 Kotlin 项目的优化

借助 Kotlin 的扩展函数的特性,任何对象都可以使用 json()方法来打印其自身。

联系方式

Wechat:fengzhizi715

Java 与 Android 技术栈:每周更新推送原创技术文章,欢迎扫描下方的公众号二维码并关注,期待与您的共同成长和进步。

ChangeLog

版本更新记录

License

Copyright (C) 2017 - present, Tony Shen.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea