抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

第一行代码——Android(一):前行必备,如何使用日志工具

2020 年 2 月 21 日

第一行代码——Android(一):前行必备,如何使用日志工具

编者按:本文节选自郭霖著《第一行代码——Android》一书中的部分章节。


前行必备——掌握日志工具的使用

现在本应该是你继续前行的时候,不过我想在这里给你穿插一点内容,讲解一下 Android 中日志工具的使用方法,这对你以后的 Android 开发之旅会有极大的帮助。


前行必备——掌握日志工具的使用:使用 Android 的日志工具 Log

Android 中的日志工具类是 Log(android.util.Log),这个类中提供了如下 5 个方法来供我们打印日志。


  • Log.v()。用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose,是 Android 日志里面级别最低的一种。

  • Log.d()。用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别 debug,比 verbose 高一级。

  • Log.i()。用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为数据。对应级别 info,比 debug 高一级。

  • Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别 warn,比 info 高一级。

  • Log.e()。用于打印程序中的错误信息,比如程序进入到了 catch 语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别 error,比 warn 高一级。


其实很简单,一共就 5 个方法,当然每个方法还会有不同的重载,但那对你来说肯定不是什么难理解的地方了。我们现在就在 HelloWorld 项目中试一试日志工具好不好用吧。


打开 HelloWorldActivity,在onCreate()方法中添加一行打印日志的语句,如下所示:


protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.hello_world_layout);    Log.d("HelloWorldActivity", "onCreate execute");}
复制代码


Log.d()方法中传入了两个参数:第一个参数是tag,一般传入当前的类名就好,主要用于对打印信息进行过滤;第二个参数是msg,即想要打印的具体的内容。


现在可以重新运行一下 HelloWorld 这个项目了,点击顶部工具栏上的运行按钮,或者使用快捷键 Shift + F10(Mac 系统是 control + R),等程序运行完毕,点击 Android Studio 底部工具栏的 Android Monitor,在 logcat 中就可以看到打印信息了,如图 1 所示。



图 1 logcat 中的打印信息


其中,你不仅可以看到打印日志的内容和 tag 名,就连程序的包名、打印的时间以及应用程序的进程号都可以看到。


另外,不知道你有没有注意到,你的第一行代码已经在不知不觉中写出来了,我也总算是交差了。


前行必备——掌握日志工具的使用:为什么使用 Log 而不使用 System.out

我相信很多的 Java 新手都非常喜欢使用System.out.println()方法来打印日志,不知道你是不是也喜欢这么做。不过在真正的项目开发中,是极度不建议使用System.out.println()方法的!如果你在公司的项目中经常使用这个方法,就很有可能要挨骂了。


为什么System.out.println()方法会这么遭大家唾弃呢?经过我仔细分析之后,发现这个方法除了使用方便一点之外,其他就一无是处了。方便在哪儿呢?在 Eclipse 中你只需要输入 syso,然后按下代码提示键,这个方法就会自动出来了,相信这也是很多 Java 新手对它钟情的原因。那缺点又在哪儿了呢?这个就太多了,比如日志打印不可控制、打印时间无法确定、不能添加过滤器、日志没有级别区分……


听我说了这些,你可能已经不太想用System.out.println()方法了,那么 Log 就把上面所说的缺点全部都改好了吗?虽然谈不上全部,但我觉得 Log 已经做得相当不错了。我现在就来带你看看 Log 和 logcat 配合的强大之处。


首先刚才提到的快捷输入,在 Android Studio 当中也是有的,比如你想打印一条 debug 级别的日志,那么只需要输入 logd,然后按下 Tab 键,就会帮你自动补全一条完整的打印语句。输入 logi,然后按下 Tab 键,会自动补全一条 info 级别的打印日志。输入 logw,按下 Tab 键,会自动补全一条 warn 级别的打印日志,以此类推。另外,由于 Log 的所有打印方法都要求传入一个 tag 参数,每次写一遍显然太过麻烦。这里还有一个小技巧,我们在onCreate()方法的外面输入 logt,然后按下 Tab 键,这时就会以当前的类名作为值自动生成一个 TAG 常量,如下所示:


public class HelloWorldActivity extends AppCompatActivity {
private static final String TAG = "HelloWorldActivity";
...}
复制代码


除了快捷输入之外,logcat 中还能很轻松地添加过滤器,你可以在图 2 中看到我们目前所有的过滤器。



图 2 logcat 中的过滤器


目前只有 3 个过滤器,Show only selected application 表示只显示当前选中程序的日志, Firebase 是谷歌提供的一个分析工具,我们可以不用管它,No Filters 相当于没有过滤器,会把所有的日志都显示出来。那可不可以自定义过滤器呢?当然可以,我们现在就来添加一个过滤器试试。


点击图 2 中的 Edit Filter Configuration,会弹出一个过滤器配置界面。我们给过滤器起名叫 data,并且让它对名为 data 的 tag 进行过滤,如图 3 所示。



图 3 过滤器配置界面


点击 OK,你就会发现你已经多出了一个 data 过滤器。当你点击这个过滤器的时候,你会发现刚才在onCreate()方法里打印的日志没了,这是因为 data 这个过滤器只会显示 tag 名称为 data 的日志。你可以尝试在onCreate()方法中把打印日志的语句改成Log.d("data", "onCreate execute"),然后再次运行程序,你就会在 data 过滤器下看到这行日志了。


不知道你有没有体会到使用过滤器的好处,可能现在还没有吧。不过当你的程序打印出成百上千行日志的时候,你就会迫切地需要过滤器了。


看完了过滤器,再来看一下 logcat 中的日志级别控制吧。logcat 中主要有 5 个级别,分别对应着上一节介绍的 5 个方法,如图 4 所示。



图 4 logcat 中的日志级别


当前我们选中的级别是 verbose,也就是最低等级。这意味着不管我们使用哪一个方法打印日志,这条日志都一定会显示出来。而如果我们将级别选中为 debug,这时只有我们使用 debug 及以上级别方法打印的日志才会显示出来,以此类推。你可以做一下试验,当你把 logcat 中的级别选中为 info、warn 或者 error 时,我们在onCreate()方法中打印的语句是不会显示的,因为我们打印日志时使用的是Log.d()方法。


日志级别控制的好处就是,你可以很快地找到你所关心的那些日志。相信如果让你从上千行日志中查找一条崩溃信息,你一定会抓狂的吧。而现在你只需要将日志级别选中为 error,那些不相干的琐碎信息就不会再干扰你的视线了。


最后我们再来看一下关键字过滤。如果使用过滤器加日志级别控制还是不能锁定到你想查看的日志内容的话,那么还可以通过关键字进行进一步的过滤,如图 5 所示。



图 5 关键字输入框


我们可以在输入框里输入关键字的内容,这样只有符合关键字条件的日志才会显示出来,从而能够快速定位到任何你想查看的日志。另外还有一点需要注意,关键字过滤是支持正则表达式的,有了这个特性,我们就可以构建出更加丰富的过滤条件。


关于 Android 中日志工具的使用我就准备讲到这里,logcat 中其他的一些使用技巧就要靠你自己去摸索了。今天你已经学到了足够多的东西,我们来总结和梳理一下吧。


图书简介https://www.ituring.com.cn/book/1841



2020 年 2 月 21 日 08:001182

评论

发布
暂无评论
发现更多内容

计算机中的层次化存储是个什么鬼?

冰河

程序员 数据结构 算法 计算机 层次化存储

吉利汽车宣布进军区块链 多个龙头股企业早已低调精准布局区块链

CECBC区块链专委会

区块链

一起重新全面认识JWT-Json Web Token

谙忆

心理学与游戏之现学现卖系列

Justin

心理学 28天写作 游戏设计

微服务架构:网关概念与zuul

程序员架构进阶

服务化 API网关 七日更 28天写作 2月春节不断更

Go1.16 发布

Rayjun

go

最常见的10种Java异常问题!

Java架构师迁哥

Dart 后台开发 Aqueduct 插入数据 获取数据API

人生如梦

flutter dart

2020 年行摄回忆录(下)

穿过生命散发芬芳

生活 摄影

干货 | Redis 实现发布订阅原理与实践

架构精进之路

redis 28天写作 发布订阅

这才是打开“金三银四”Java面试的正确方式,2021“金三银四”看这个就对了

云流

Java 架构 面试

程序员成长第十篇:从阅读代码开始

石云升

28天写作 2月春节不断更 阅读代码

Nginx零成本、易操作实现网站视频加速

运维研习社

nginx 流媒体 网站优化

Let's Encrypt签发工具CertBot-auto不再维护

运维研习社

让代码说话:如何把版本信息注入到代码中

zhujun

c++ Python go git rust

Hive底层原理:explain执行计划详解

五分钟学大数据

大数据 hive 二月春节不断更

2021 Flutter从零开始之全栈开发,后台到在线教育APP上线。

人生如梦

flutter dart

Dart 后台开发 Aqueduct ORM初始化数据库

人生如梦

Dart 后台开发 Aqueduct @Column标记

人生如梦

我的这一期=孩子

Ian哥

28天写作

关于智商测试的一点闲话 Day1

道伟

科普 28天写作

28天瞎写的第二百三十九天:什么是正念冥想?

树上

冥想 28天写作 正念

腾讯发布区块链产业加速器,生态共创助力新基建建设

CECBC区块链专委会

腾讯

亿级流量架构之资源隔离思路与方法

程序员小毕

Java 程序员 架构 面试 分布式

Flutter安卓项目第一次启动失败解决方案

人生如梦

flutter

Dart 后台开发 Aqueduct集成Swagger客户端

人生如梦

flutter dart

在区块链的新浪潮中,为更多人争取“公平”

CECBC区块链专委会

区块链 新浪潮

翻译:《实用的Python编程》02_01_Datatypes

codists

Python 人工智能 数据结构与算法 字典 元组

MySQL 批量修改所有表字段字符集及排序规则

运维研习社

MySQ

为什么ElasticSearch比MySQL更适合全文索引

程序员历小冰

数据库 lucene elasticsearch BitMap 跳表

(28DW-S8-Day1) 定个魔幻的范围:在线教育+区块链

mtfelix

比特币 区块链 在线教育 28天写作 教育+区块链

Study Go: From Zero to Hero

Study Go: From Zero to Hero

第一行代码——Android(一):前行必备,如何使用日志工具-InfoQ