新版logcat最全使用指南
创始人
2025-05-31 15:42:46
0

前言:

俗话说,工欲善其事,必先利其器。logcat是我们通过日志排查bug的重要武器之一。从某个版本开始,logcat改版了,改版之后,也许某些人觉得不太习惯,但是如果稍微学习下之后,就发现新版的logcat真的比老版本的好多太多。

也许某个人懒,不太愿意去android的官网查看官方介绍,那么本地特别适合你,本文就是对官网介绍的详细说明以及实例的演示。

android官网logcat的相关介绍。

https://developer.android.google.cn/studio/debug/logcat?hl=zh-cn

logcat界面基本介绍

首先介绍下logcat界面上的组成:

1.顶部框

名称

说明

TAB栏

一个TAB栏对应一个logcat显示框,可以配置多个

设备

当同时连接太多设备时,可以选择不同的设备显示其logcat

筛选框

对输出的logcat按照规则进行筛选,具体筛选的规则第二章来讲

配置按钮

对logcat显示的区域,位置,大小等等进行配置

2.左侧栏

名称

说明

暂停

暂停logcat的日志输出,使其保持在当前状态。

这个功能很适合我们排查bug时发现了一场日志,避免后面的持续输出的日志的影响。

重启

重启logcat功能。

置底按钮

logc不断输出,使显示的log内容一直是最新的,也就是现实log内容的最底部。

往上查找

往上查找最近一次的堆栈日志。

往下查找

往下查找最近一次的堆栈日志。

分行显示

有时候一个logcat内容输出太多,默认一行展示不下就缩略了。选择多行显示时,会分成多行显示。

配置显示内容

对内容框中显示的内容进行配置

分成多块显示

底部框分成两块,分别独立显示logcat

截屏

截屏功能

录屏

录屏功能

3.搜索栏

名称

说明

搜索内容

输入搜索的内容,这里支持区分大小写,单词匹配,转义。

向上

向上查找

向下

向下查找

搜索范围选择

选择搜索的范围,比如所有类型,评论中,字符串中等等

4.内容框

名称

说明

时间

日志输出的时间,这里的时间为手机上的时间。

进程ID和线程ID

进程ID和线程ID,这里的线程ID指的是在linux虚拟机中的线程ID。

TAG

我们日志中的tag。

进程名

进程名,如果是APP应用的话一般为包名。

日志优先级

共有六种登记,分别为verbose/debug/info/warn/error/assert

日志内容

我们日志中的msg。

筛选功能

1.包名

我们可以根据包名来对log的内容进行筛选,如果我们筛选的包名是com.xt.appplugin ,则可以在筛选框输入:package:com.xt.appplugin,这样筛选出来的log就只是com.xt.appplugin这个应用输出的了。

如果当前调试的应用就是com.xt.appplugin的话,我们也可以输入:package:mine,mine代表就是当前应用,如下:

2.进程名

进程名和包名有什么区别呢?因为一个应用可以多进程,如果我们只关心其中某一个进程的日志输出,就可以使用这个功能。

为了方便读者理解,我们举例说明一下,测试代码如下:

//Activity中
findViewById(R.id.text1).setOnClickListener(v -> {Log.i("lxltest", "button1 press");Intent intent = new Intent(this, TestService.class);startService(intent);
});
//Service中
public class TestService extends Service {@Overridepublic void onCreate() {super.onCreate();Log.i("lxltest", this.getClass().getSimpleName() + ",onCreate");}
}

如果我们输入的筛选内容是:package:com.xt.appplugin

则输出日志内容为:

2023-03-16 10:46:07.059  9333-9333  lxltest                 com.xt.appplugin                     I  button1 press
---------------------------- PROCESS STARTED (9381) for package com.xt.appplugin ----------------------------
2023-03-16 10:46:07.215  9381-9381  ziparchive              com.xt.appplugin                     W  Unable to open '/data/data/com.xt.appplugin/code_cache/.overlay/base.apk/classes3.dm': No such file or directory
2023-03-16 10:46:07.216  9381-9381  .appplugin:aaaa         com.xt.appplugin                     W  ClassLoaderContext classpath size mismatch. expected=0, found=1 (PCL[] | PCL[/data/data/com.xt.appplugin/code_cache/.overlay/base.apk/classes3.dex*1426120062])
2023-03-16 10:46:07.230  9381-9381  GraphicsEnvironment     com.xt.appplugin                     V  ANGLE Developer option for 'com.xt.appplugin' set to: 'default'
2023-03-16 10:46:07.230  9381-9381  GraphicsEnvironment     com.xt.appplugin                     V  ANGLE GameManagerService for com.xt.appplugin: false
2023-03-16 10:46:07.231  9381-9381  GraphicsEnvironment     com.xt.appplugin                     V  Updatable production driver is not supported on the device.
2023-03-16 10:46:07.236  9381-9381  NetworkSecurityConfig   com.xt.appplugin                     D  No Network Security Config specified, using platform default
2023-03-16 10:46:07.236  9381-9381  NetworkSecurityConfig   com.xt.appplugin                     D  No Network Security Config specified, using platform default
2023-03-16 10:46:07.239  9381-9381  lxltest                 com.xt.appplugin 

而我们输入的筛选内容如果是:process:com.xt.appplugin:aaaa

则输出内容是:

---------------------------- PROCESS STARTED (9591) for package com.xt.appplugin ----------------------------
2023-03-16 10:47:08.735  9591-9591  ziparchive              com.xt.appplugin                     W  Unable to open '/data/data/com.xt.appplugin/code_cache/.overlay/base.apk/classes3.dm': No such file or directory
2023-03-16 10:47:08.737  9591-9591  .appplugin:aaaa         com.xt.appplugin                     W  ClassLoaderContext classpath size mismatch. expected=0, found=1 (PCL[] | PCL[/data/data/com.xt.appplugin/code_cache/.overlay/base.apk/classes3.dex*1426120062])
2023-03-16 10:47:08.750  9591-9591  GraphicsEnvironment     com.xt.appplugin                     V  ANGLE Developer option for 'com.xt.appplugin' set to: 'default'
2023-03-16 10:47:08.751  9591-9591  GraphicsEnvironment     com.xt.appplugin                     V  ANGLE GameManagerService for com.xt.appplugin: false
2023-03-16 10:47:08.751  9591-9591  GraphicsEnvironment     com.xt.appplugin                     V  Updatable production driver is not supported on the device.
2023-03-16 10:47:08.756  9591-9591  NetworkSecurityConfig   com.xt.appplugin                     D  No Network Security Config specified, using platform default
2023-03-16 10:47:08.757  9591-9591  NetworkSecurityConfig   com.xt.appplugin                     D  No Network Security Config specified, using platform default
2023-03-16 10:47:08.760  9591-9591  lxltest                 com.xt.appplugin                     I  TestService,onCreate
2023-03-16 10:47:13.687  9591-9602  System                  com.xt.appplugin                     W  A resource failed to call close. 

区别其实就是少了主进程的下面这条日志:

2023-03-16 10:46:07.059  9333-9333  lxltest                 com.xt.appplugin                     I  button1 press

3.TAG

TAG就比较容易理解了,根据输入的TAG进行筛选。这里的tag使用的是模糊匹配。

比如下面代码:

Log.i("lxltest", "button press");
Log.e("lxl", "button end");

如果我们使用的是:tag:lxl

则最终的输出内容就是,会把所有tag以lxl为前缀的日志全部筛选出来。

2023-03-16 10:49:53.200  9535-9535  lxltest                 com.xt.appplugin                     I  button press
2023-03-16 10:49:53.200  9535-9535  lxl                     com.xt.appplugin   

而如果使用lxltest,则只会筛选出button press这一条了。

4.日志级别

日志级别使用的关键词是level,从低到高分别是:verbose/debug/info/warn/error/assert六种级别。

筛选低级别的日志可以打印高级别的日志,反之则不行。

我们仍然用代码来验证下:

Log.v("lxltest", "level verbose");
Log.d("lxltest", "level debug");
Log.i("lxltest", "level info");
Log.w("lxltest", "level warn");
Log.e("lxltest", "level error");
//打印assert级别的日志
Log.println(Log.ASSERT, "lxltest", "level assert");

如果筛选框输入的是:level:verbose,则日志内容输入如下:

如果筛选框输入的是:level:info,则日志内容输入如下:

如果筛选框输入的是:level:assert,则日志内容输入如下:

5.内容

默认输出全部日志如下:

内容筛选支持模糊搜索,筛选框输入:message:level,因为level对所有的字符串都生效,所以日志全部输出,显示如下:

 筛选框输入message:level info,因为只能匹配level info这一项,所以显示内容如下:

内容筛选时,输入也可以输入message:'level info'和也可以输入message:level info的效果是一样的。

6.时间

关键词age,我们可以通过这个关键词对日志以时间纬度进行一定的筛选。

比如我想筛选10分钟内的所有日志,则筛选框输入:age:10m即可,其它时间同理,最大支持到天。

单位

介绍

s

m

分钟

h

小时

d

值得注意的是,这里的筛选时间指的是以电脑时间对日志的时间进行筛选。举例例子,电脑时间为12:30,手机时间为12:00。筛选10m内所有日志,AS会去寻找所有时间范围在12:20到12:30之间的日志,这肯定是找不到的,所以最终的日志显示就是空。所以使用这一筛选项时,务必保证手机和电脑时间是同步的。

7.多选-且

大多数情况下,单一的某一个筛选条件肯定是不够的,所以就需要多个筛选条件组合起来用。

logcat筛选框中,如果同时输入多个条件,默认情况下不同类型的筛选,是且的关系。

比如如下的日志:

Log.v("lxltest", "level verbose");
Log.d("lxltest", "level debug");
Log.i("lxltest", "xxxxx info");
Log.w("lxltest", "level warn");
Log.e("lxltest", "level error");
Log.println(Log.ASSERT, "lxltest", "level assert");

筛选条件输入两个:message:level level:warn

这时候level verbose的这条日志就会被过滤掉,只显示其余的3条日志,xxxxx info

如果是相同类型的筛选,则默认是或的关系,比如还是上面的那个例子,

我们输入筛选条件:message:level message:info

因为上面六个选项中,使用模糊匹配,全部满足,所以六条日志全部显示出来了

如果相同类型仍然进行且的筛选,则我们需要改一下筛选条件:message:level & message:warn

这时候同时满足message中包含level和warn的只有level warn这一条,所以也就展示了这一条。

8.多选-或

刚才讲过,如果如果同时输入多个不同条件的筛选项,那么是且的关系。如果我们想改成或应该怎么办呢?

还是上面那个例子,我们改一下筛选项:message:level | level:warn

这时候就变成了满足message中包含level或者日志等于大于等于warn的才显示。

9.多选-组合

上面讲了种种筛选的场景,如果仍然无法满足我们的需求怎么办?这时候我们就要使用灵活多样的组合了。

比如来一个实际的场景,我想监控从A应用点击按钮开始,跳转到B应用页面的完整日志流程,其中就包含了多种条件的组合。

1.进程名为com.xt.appplugin(应用A),system_server(系统应用)或com.xt.client(应用B)

2.tag为lxltest或者Activity

3.日志级别为debug

则我们组合上面所列的各种筛选条件,如下:

(process:system_server | process:com.xt.appplugin | process:com.xt.client) & level:debug & (tag:lxltest | tag:Activity)

最终点击按钮(button click),经过系统分发,最终跳转到了应用B。

日志结果如下,我们可以看到跨越三个进程的相关日志。

界面配置

也许有的人会吐槽,新版本的msg太短了,有的吐槽一屏显示的内容太少,别急,通过界面配置,可以打造出我们想要的dream window。

左侧栏功能介绍

首先我们看一下左侧栏有哪些功能

1.日志清空

顾名思义,清空日志内容。

2.日志暂停

我们排查BUG的时候,往往发现问题后还没来得及仔细看,相关的就被后来的日志给挤走了。这时候如果点击了暂停按钮,新的日志就不会继续输出,方面我们排查问题了。

3.logcat重启

顾名思义,重启logcat,如果遇到log不输出等问题可以点击这个按钮。

4.光标置底

选中时,有最新的日志输出时右侧的进度条会自动切换到最底部。

取消选中时,则不会固定在最底部

5.定位上一个/下一个堆栈

当有异常时,点击这个按钮会自动帮我们切换到对应的代码中。

点击下时则帮我们切换到at android.os.Looper.loopOnce(Looper.java:201)这一行所对应的代码。

6.分行显示

不分行显示时:

分行显示时:

7.配置显示内容

目前显示的内容包括时间/进程-线程ID/TAG/进程名/日志级别/MSG内容,是不是觉得太多?如果我只是调试自己的应用,就没必要关心其它进程的日志信息。那么我们就可以进行配置

比如作者删除了进程名和包名,msg可显示的区域一下子就变多了。

8.分屏显示

可以同时显示两块logcat区域,我们可以是上下还是左右的方式显示

9.截屏和录屏

顾名思义,就不过多解释了

顶部框功能集合介绍

顶部功能包括TAB栏,配置按钮

1.TAB栏

tab栏可以配置多个logcat显示框,比如作者就配置了两个logcat框,可以自由切换。

2.配置显示模式

首先我们来讲配置->View Mode,这里可以配置我们期望日志框展示的模式。

比如作者最经常使用的Float模式,一整屏显示日志,超级爽。

3.配置显示区域

接下来讲配置->Move to的功能。这里可以配置日志框显示的区域。

 比如改成Left Top

相关内容

热门资讯

最新或2023(历届)六一儿童... A:尊敬的各位领导、各位老师,敬爱的爷爷奶奶,爸爸妈妈,  B:亲爱的同学们,少年朋友们:  合:大...
大学生课堂上玩手机检讨书范本 ...  尊敬的×××:  今天我怀着十分愧疚的心情,从思想的深处做深刻的检讨,事情的经过是这样的,在今天的...
上班打牌检讨书500字 上班打...   尊敬的领导:  您好,向您递交这份检讨,严肃深刻地反省我在工作期间打牌的错误行为。此刻,我对自身...
工作失职造投诉的检讨书 违反广...   尊敬的各位领导,同志们:  大家好!  我怀着无比愧疚和自责的心情向大家递交这份工作失职检讨书。...
营销会议邀请函 营销会议邀请函...   营销会议邀请函(一)  随着电子商务、商务信息化的广泛普及,现今已从互联网时代、电商时代跨入了微...
员工工作不力失误操作的检讨书 ...  尊敬的领导:  鉴于近期工作不力,我作出如下深刻检讨。  每周工作报送是我的本职工作之一,就是将每...
公司员工失职检讨书 公司员工失... 尊敬的领导:  我怀着十二万分的愧疚以及十二万分的懊悔向你们写下这份检讨书,我为自己睡岗行为感到了深...
医院职工上班迟到检讨书800字...   尊敬的领导:  近段时间,由于一些个人原因,以至于出现了几次上班迟到的现象,不管是上班太晚,熬夜...
大学生旷课检讨书范文3000字...  尊敬的老师:  今天我怀着愧疚和懊悔写下这份检讨书,以表示我对旷课这种不良行为的深刻认识以及再也不...
忘记穿校服的检讨书 忘记穿校服...  尊敬的老师:  今天,我怀着十二万分的愧疚以及十二万分的懊悔给您写下这份检讨书。 早在我刚踏进这个...
学生会工作失误的检讨书 检查卫... 尊敬的书记:  您好!  针对近期学生会工作开展及任务完成情况,出现的一系列的问题,我作为新上任的系...
预备党员缺席会议检讨书范文 机...   敬爱的党组织:  今天我怀着愧疚和懊悔向党组织公布这封检讨书,以表示我作为一名预备党员对缺席党组...
缺席预备党员转正会议的检讨书5...  敬爱的党组织:  对于本周×举行的预备党员转正会议,我没能参加,为此我感到非常抱歉,违反了组织的规...
学生逃课检讨书范本3000字 ...  尊敬的老师:  学生主要任务是学习,就像老师忙着点名一样,本职工作不做好,还有什么理由?旷课是错的...
工作不认真玩手机检讨书300字...   尊敬的各位领导:  首先由于我的工作不认真的原因,没有把工作做好出现了不应该的工作失误在此我做出...
最新或2023(历届)机关单位...   3月xxx同志被提拔为区公路局综合办公室副主任,主要从事文字材料工作。从一个局二级单位办公室主任...
最新或2023(历届)优秀党员...   范文一:  作为一名一直奋战在基层农村的普通党员,始终保持坚强的党性,无条件地服从组织安排,从不...
最新或2023(历届)党委书记...   让党性在世界之巅绽放光彩  ——记西藏自治区浪卡子县普玛江塘乡党委书记、人大主席次仁罗布  在西...
先进个人事迹材料怎么写,先进个... 先进个 人事迹写作技巧  相对于其他公文的写作来说,不管是先进个 人事迹材料,还是先进集体事迹材料的...
医院优秀党员先进事迹材料 医院... 本人自参加工作以来,处处以共产党员的标准严格要求自己,立足本职,爱岗敬业,恪尽职守,努力学习,勤奋工...