编者按:本文节选自郭霖著《第一行代码——Android》一书中的部分章节。
现在本应该是你继续前行的时候,不过我想在这里给你穿插一点内容,讲解一下Android中日志工具的使用方法,这对你以后的Android开发之旅会有极大的帮助。
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名,就连程序的包名、打印的时间以及应用程序的进程号都可以看到。
另外,不知道你有没有注意到,你的第一行代码已经在不知不觉中写出来了,我也总算是交差了。
我相信很多的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中其他的一些使用技巧就要靠你自己去摸索了。今天你已经学到了足够多的东西,我们来总结和梳理一下吧。
领取专属 10元无门槛券
私享最新 技术干货