Logger 使用教程

来源:互联网 发布:淘宝卖的玻璃杯 编辑:程序博客网 时间:2024/06/15 19:02

转载网址:http://blog.csdn.net/like_program/article/details/52986553


1.Logger 是什么

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

当然,有的同学可能要说,这又没什么,自己封装一个 Log 不就行了。但是对新手来说,自己封装有一定的难度,如果有现成的开源库可以直接拿来用就好了。

Github 上的大牛当然也注意到了这个情况,于是开源日志库 Logger 诞生了。

Logger 的 Github 主页:https://github.com/orhanobut/logger

Logger 提供以下功能:

  • 线程的信息
  • 类的信息
  • 方法的信息
  • 将 JSON 文本人性化输出
  • 将换行符人性化输出
  • 简洁的输出
  • 从日志跳转到源码

Logger 与 原生 Log 最大的不同就是:Logger 打印出来的日志一目了然,引用下官方 Github 上的图片,看下原生 Log 和 Logger 打印日志的区别:

原生 Log 打印的日志:

原生 log

Logger 打印的日志:

Logger

可以看到,Logger 打印的日志把多余的日志全部忽略了,只显示对我们有用的日志,而且还把日志框了起来,可以让我们看得更舒服。不得不说,Logger 做的实在是太人性化了。

Logger 使用方法也不难,Logger 开源库的 Github 主页 写了很详细的使用方法,英文还过得去的同学可以直接去 Logger 主页查看使用方法,有英文恐惧症的同学呢,可以通过这篇博客来学习下。

2.Logger 的使用

打开 Android Studio,新建 LoggerTest 项目。

1.导入依赖

在 LoggerTest / app/ build.gradle 中的 dependencies 中,导入依赖,代码如下:

dependencies {    compile 'com.orhanobut:logger:1.15'}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

然后 Android Studio 应该会弹出 Sync Now,也就是箭头 1 指向的位置,如图:

导入依赖

如果弹出了 Sync Now,就点击它,如果没有弹出,就点击箭头 2 指向的选项。

等 Grade 构建完,我们就可以使用 Logger了。

2.简单使用

Logger 的使用方法和原生 Log 差不多,我们先来尝试下打印一个简单文本。

修改 MainActivity.Java 中的 onCreate() 方法,代码如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Logger.d("执行了 onCreate");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

咦,怎么没写 TAG?其实,Logger 是有它自己默认的 TAG 的,默认的 TAG 是 PRETTYLOGGER,我们运行一下程序,看一下输出日志:

没有过滤

我们可以看到,已经成功的将日志输出了,而且比我们之前用的原生 Log 输出的美观多了,日志信息一目了然。箭头指向的就是 Logger 默认的 TAG,所以如果你想让 Logcat 只显示你自己打印的日志,可以在日志过滤器中,将默认 TAG 添加进去。

添加默认 TAG 1

添加默认 TAG 2

或者直接在过滤框中添加:

在过滤框中直接添加

3.打印更多类型数据

Logger 还支持打印 JSON,XML 等格式的数据。

1.JSON 类型数据

private String JSON_CONTENT = "{\"weatherinfo\":{\"city\":\"北京\",\"cityid\":\"101010100\"," +            "\"temp\":\"18\",\"WD\":\"东南风\",\"WS\":\"1级\",\"SD\":\"17%\",\"WSE\":\"1\"," +            "\"time\":\"17:05\",\"isRadar\":\"1\",\"Radar\":\"JC_RADAR_AZ9010_JB\"," +            "\"njd\":\"暂无实况\",\"qy\":\"1011\",\"rain\":\"0\"}}";@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Logger.json(JSON_CONTENT);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

打印 JSON

2.XML 类型数据

private String XML_CONTENT = "<china dn=\"nay\"><city quName=\"黑龙江\" pyName=\"heilongjiang\" " +            "cityname=\"哈尔滨\" state1=\"1\" state2=\"1\" stateDetailed=\"多云\"/><city quName=\"吉林\"" +            " pyName=\"jilin\" " +            "cityname=\"长春\" state1=\"0\" state2=\"0\" stateDetailed=\"\"/><city quName=\"辽宁\" " +            "pyName=\"liaoning\" " +            "cityname=\"沈阳\" state1=\"1\" state2=\"0\" stateDetailed=\"多云转晴\"/><city " +            "quName=\"海南\" pyName=\"hainan\" " +            "cityname=\"海口\" state1=\"22\" state2=\"21\" stateDetailed=\"中到大雨转小到中雨\"/></china>";@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Logger.xml(XML_CONTENT);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

XML 类型数据

3.List 类型数据

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    // List 类型数据    List<String> list = new ArrayList<>();    list.add("hello");    list.add("world");    Logger.d(list);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

List 类型数据

4.Map 类型数据

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    // Map 类型数据    Map<String, String> map = new HashMap<>();    map.put("key_hello", "hello");    map.put("key_world", "world");    Logger.d(map);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Map 类型数据

5.Set 类型数据

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    // Set 类型数据    Set<String> set = new HashSet<>();    set.add(new String("hello"));    set.add(new String("world"));    Logger.d(set);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Set 类型数据

4.字符串格式化

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Logger.d("hello %s %d", "world", 5);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

字符串格式化

5.自定义 TAG

如果你不满意默认的 TAG,也可以自己定义一个 TAG,只需要调用一次 Logger.init() 就行了。因为只需要调用一次,所以可以在 Application 中来完成 Logger 的初始化。

新建 MyApplication 继承 Application,代码如下:

public class MyApplication extends Application {    private static String TAG = "LoggerTest";    @Override    public void onCreate() {        super.onCreate();        Logger.init(TAG);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

修改 AndroidManifest.xml 中 application 的属性,添加 android:name=".MyApplication" ,AndroidManifest.xml 代码如下:

<application    android:name=".MyApplication"    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>        </intent-filter>    </activity></application>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这样 App 启动时,初始化的就是我们自定义的 MyApplication 了。然后我们在 MainActivity 的 onCreate() 中打印一下日志,看下自定义的 TAG 生效了没。

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Logger.d("hello world");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

自定义 TAG

可以看到,我们自定义的 TAG 已经生效了。那么有的同学可能会有疑问了,我要是不想一直用这个 TAG 呢,要是临时想换个 TAG 用呢,当然也是有办法的,调用 Logger.t("临时TAG名").d() ,就能使用临时的 TAG 打印日志了。

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Logger.t("MyTag").d("hello world");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

临时TAG

可以看到,临时的 TAG 名被追加到自定义 TAG 的后面了。

6.设置不打印日志

之前说了,日志只是开发的时候需要用到,等到项目上线就不能用了。Logger 当然也考虑到了这一点,通过设置 Logger.init(TAG).logLevel(LogLevel.NONE) 可以设置为不打印日志。logLevel() 方法默认的参数是 LogLevel.FULL,也就是打印全部日志。修改 MyApplication 的 onCreate() 方法:

@Overridepublic void onCreate() {    super.onCreate();    Logger.init(TAG).logLevel(LogLevel.NONE);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

运行一下,可以发现 Logger 没有打印日志。

7.打印 Exception

Logger 打印 Exception,可以很清晰的看到 Exception 信息,这里我们写一个数组越界异常:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    int[] a = new int[3];    try {        a[4] = 3;    } catch (Exception e) {        Logger.e(e, "message");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

数组越界异常

8.更多个性化设置

Logger 还有一些个性化设置,比如

Logger.init(TAG)        .methodCount(3) // 方法栈打印的个数,默认是 2        .hideThreadInfo() // // 隐藏线程信息,默认显示        .methodOffset(2) // 设置调用堆栈的函数偏移值,默认是 0        .logAdapter(new AndroidLogAdapter()); // 自定义一个打印适配器

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 cmyk和rgb有色差怎么办 染头发新长出来怎么办 白色衣服弄上口红怎么办 口红弄到牛仔裤上怎么办 口红弄到沙发上怎么办 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办 拔完火罐洗澡疼怎么办 拔罐之后脊背疼怎么办? 五个月的狗胆小怎么办 电脑颜色不正常分辨率调不了怎么办 宝宝认人怎么办 五个月 新生儿42天听力筛查未通过怎么办 幼儿大便干燥拉不下粑粑怎么办 宝宝大便干燥拉粑粑带浓血怎么办 新生儿便秘4天了怎么办 写卷子的题目不认识怎么办? 2个月小猫尿床怎么办 安全教案鱼刺卡住了怎么办 被鱼刺卡住怎么办安全教案 小班健康教案生病了怎么办 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办? 孩子挑食不吃菜不吃肉怎么办 微信新的朋友回复频繁怎么办 忘了闺蜜生日怎么办 把闺蜜生日忘了怎么办 忘了闺蜜的生日怎么办 一岁宝宝不吃菜怎么办 幼儿园教案虫子爬进耳朵怎么办