前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用adb logcat命令显示Android设备上的Log日志

使用adb logcat命令显示Android设备上的Log日志

作者头像
全栈程序员站长
发布2022-06-28 17:15:04
8.8K0
发布2022-06-28 17:15:04
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

使用adb logcat命令显示Android设备上的Log日志

有时候我们在手机程序上的日志要在其他地方调试,然后要看里面的Log日志。

本文教大家如何在不需要studio就可以查看手机程序中的Log日志。

实现这个功能的前提是使用adb命令,所以必须要有手机和电脑,还有安装adb,adb程序是很小的几M就可以。

一、在cmd窗口查看手机的Log日志

在确定连上手机后(adb device,可以看到电脑连接的手机)

在cmd窗口中输入如下命令,就可以像Studio中的Logcat窗口中显示日志信息:

代码语言:javascript
复制
//格式1:打印默认日志数据
adb logcat 

//格式2:需要打印日志详细时间的简单数据
adb logcat -v time

//格式3:需要打印级别为Error的信息
adb logcat *:E

//格式4:需要打印时间和级别是Error的信息
adb logcat -v time *:E

//格式5:将日志保存到电脑固定的位置,比如D:\log.txt
adb logcat -v time >D:\log.txt

这时手机日志更新什么日志,cmd窗口也会同步更新数据。

但是这样没有过滤条件,如果Log日志很多,很难找到我们想要的信息,

当然也可以复制cmd中的数据到一个文本中慢慢处理的,就是效率不高。

下面介绍adb logcat中的详细参数命令以及如何才能高效的打印日志,或者把日志保存到我们指定的位置。

二、adb logcat 详解

adb logcat如果用过,但是具体命令又不记得

可以输入adb logcat -help,查看一下一些简单的数据格式:

adb help
adb help

但是,没用过adb logcat,对于上面的指令也是不知所以然的。可以先看看后面的介绍。

1.adn logcat日志格式

代码语言:javascript
复制
adb logcat [<option>] ... [<filter-spec>] ...
adb logcat [选项...] [过滤项...],

前面那些-s,-v就是选项,后面那些V、D、I、W、E、F、S是级别过滤项,同一个tag只能有一个过滤项,多个tag可以有多个过滤项。

先介绍过滤项,这个比较简单,后面在介绍选项

2.按级别过滤日志

格式:

代码语言:javascript
复制
adb logcat <tag>[:priority]

tag表示标签,priority输出的级别

日志默认级别是V,如果错误日志我们选择E就可以。

代码语言:javascript
复制
Android 的日志分为如下几个优先级(priority):

V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不输出)

按某级别过滤日志则会将该级别及以上的日志输出。

比如,命令:

代码语言:javascript
复制
adb logcat *:W

其实*可以是某个tag,如果没有指明,就表示所有。

会将 Warning、Error、Fatal 和 Silent 日志输出。

(注: 在 macOS 下需要给 :W 这样以 * 作为 tag 的参数加双引号,如 adb logcat “:W”,不然会报错 no matches found: *:W。)

3.按 tag 和级别过滤日志

可以由多个 [:priority] 组成。

比如,命令:

代码语言:javascript
复制
adb logcat ActivityManager:I MyApp:D *:S

表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。

###但是我发现自己使用tag标签命令,并没有成功过滤。并且使用tag后,后面的级别也无效了,所以tag使用*号比较保险。

4.adb logcat选项解析

代码语言:javascript
复制
--"-s"选项 : 设置输出日志*:s的标签, 只显示该标签的日志;
--"-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
--"-r"选项 : 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
--"-n"选项 : 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
--"-v"选项 : 设置日志的输出格式, 注意只能设置一项;
--"-c"选项 : 清空所有的日志缓存信息;
--"-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;
--"-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;
--"-g"选项 : 查看日志缓冲区信息;
--"-B"选项 : 以二进制形式输出日志;

上面很多选项基本是没啥作用的,比如-s相当于过滤*:s的日志,所以是没有日志输出的

这里介绍下用得比较多的选项-v、-c:

(1)adb logcat -v

-v是设置日志的输出格式的

日志支持按以下几种格式 :

①brief

默认格式。格式为:

代码语言:javascript
复制
<priority>/<tag>(<pid>): <message>

示例:

代码语言:javascript
复制
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0

#####②process

格式为:

代码语言:javascript
复制
<priority>(<pid>) <message>

示例:

代码语言:javascript
复制
D( 1785) Disconnected process message: 10, size: 0  (HeadsetStateMachine)

#####③tag

格式为:

代码语言:javascript
复制
<priority>/<tag>: <message>

示例:

代码语言:javascript
复制
D/HeadsetStateMachine: Disconnected process message: 10, size: 0

#####④raw

格式为:

代码语言:javascript
复制
<message>

示例:

代码语言:javascript
复制
Disconnected process message: 10, size: 0

#####⑤time

格式为:

代码语言:javascript
复制
<datetime> <priority>/<tag>(<pid>): <message>

示例:

代码语言:javascript
复制
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0

#####⑥threadtime

格式为:

代码语言:javascript
复制
<datetime> <pid> <tid> <priority> <tag>: <message>

示例:

代码语言:javascript
复制
08-28 22:39:39.974  1785  1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0

#####⑦long

格式为:

代码语言:javascript
复制
[ <datetime> <pid>:<tid> <priority>/<tag> ]

#####⑧ 示例:

代码语言:javascript
复制
[ 08-28 22:39:39.974  1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0

#####⑨指定格式可与上面的过滤同时使用。比如:

代码语言:javascript
复制
adb logcat -v long ActivityManager:I *:S

对于-v选项: 如果需要的是普通日志那么使用-v time就可以了, 如果需要查看线程区别使用 -v threadtime就可以了,其他日志基本也是少用的。

(2)adb logcat -c

adb logcat -c是用来清除缓存信息的,这个没有参数

三、把日志信息保存到电脑中

adb logcat最后添加” > 保存文件的地址 “

比如需要将的信息保存到电脑中使用下面的命令:

代码语言:javascript
复制
adb logcat -v time > D:\log.txt

你就可以在D盘中看到一个log.txt文件,并且里面有之前的日志信息

如果没有指定具体的位置的命令

代码语言:javascript
复制
adb logcat -v time > log.txt

这个文件是保存在C盘的用户名的文件夹下的。

四、使用adb logcat总结

常用的其实就两三个命令

代码语言:javascript
复制
1.adb logcat -v time
2.adb logcat -v time > D:\log.txt
3.adb logcat -c

直接显示日志信息,是会显示很多日志信息的,好像是从设备最近一次开机的日志开始显示

最好的做法的先使用-c清除之前的日志信息,再触发事件,查看最近的日志信息

##下面是我的一个示例: 在MainActivity的生命周期中写几个方法打印Log,清除日志后,运行程序,查看日志文本。

###1.Android代码:

代码语言:javascript
复制
package com.example.wenzhi.adblog;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private String TAG = "adb MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(TAG, "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart");
    }

    @Override
    protected void onPause() {
        super.onPause();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.e(TAG,"onPause on over thread");
            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy");
    }
}

###2.adb命令和过程,结果

2
2

###3.如果把日志直接显示在cmd窗口中

33
33

日志窗口是会不断增加的。。。

到这里adb logcat的使用就已经详细介绍完毕了。

如果想了解adb其他详细的命令:https://github.com/mzlogin/awesome-adb#%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97

其实上面都是一些简单知识,是对知识的探索学习, 但是真正实际使用就几个命令。

看到这么多人,浏览这个文章, 我感觉是应该把一些真正实用的东西分享給大家, 就是adb脚本, 实际开发中使用adb脚本能达到事半功倍的效果。

下面是我个人在开发过程中常用的几个关于日志的脚本, 双击即可运行,非常方便。

五、开发中实用的关于日志脚本

1、清除日志缓存.bat

代码语言:javascript
复制
adb logcat -c

这个脚本是配合下面获取日志的脚本使用的,可以清除之前缓存的数据,只抓取自己当前准备获取的日志信息。

2、获取日志文件.bat

代码语言:javascript
复制
adb wait-for-device
adb devices
adb shell logcat -v threadtime >"%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%log.txt"
pause

这个日志在分析问题有一定的作用,哪怕是系统问题也会有日志。 并且这里加入wait-for-device,有些情况可以定位开机就重启或者系统挂的问题。

3、抓取Android整个日志 .bat

获取Android整个日志文件,这个是需要root权限的

代码语言:javascript
复制
adb pull /data/log/android_logs/
pause

4、获取系统最前端窗口信息.bat

代码语言:javascript
复制
echo ####Current: %date% %time%
set date_time="%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
adb shell dumpsys window > windowInof_%date_time%.txt
pause

这个脚本可以获取当前Activity名称和apk的包名等信息

在windowInof.txt文件,搜索关键字:mCurrentFocus

比如UC浏览器的界面信息:

mCurrentFocus=Window{86e35b9 u0 com.UCMobile/com.uc.browser.InnerUCMobile}

包名:com.UCMobile Activity全路径:com.UCMobile/com.uc.browser.InnerUCMobile

4、获取全量日志.bat

下面这个日志脚本在系统开发中是非常使用的, 把系统中重要的数据都进行了获取, 无论系统出现什么样的问题都会有一定的参考价值。

这个适用于系统开发,也是需要root权限的, 因为有些文件目录普通用户是获取不到的

代码语言:javascript
复制
@echo off
::V1.0 2021-1-18

::各个系统不同,可以根据需求添加或者删除不必要的目录下的数据获取

echo 版本号:Get Android All Log V1.0
echo.

echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒@

set date_time="%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%_%time:~6,2%%time:~9,2%"
::设置显示的文件夹名称
set Folder="Logs_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%_%time:~6,2%%time:~9,2%"
echo 日志文件夹:%Folder%
mkdir %Folder%

::获取root权限,下面pull一些隐私目录的数据需要root权限
adb remount
adb root
::创建文件夹
mkdir %Folder%\device
::获取系统的所有app服务
adb shell ps -A > %Folder%\device\ps.txt
::获取系统的cup等占用情况
adb shell top -b -n 1 > %Folder%\device\top.txt
::获取系统的cup前十个占用最多的进程信息
adb shell top -b -n 1 -H -m 10 -s 6 -o pid,tid,user,pr,ni,%%cpu,s,virt,res,pcy,cmd,name > %Folder%\device\top2.txt
::获取系统的进程内核信息
adb shell cat /proc/cmdline > %Folder%\device\cmdline.txt
::获取系统的进程内存占用信息
adb shell cat /proc/meminfo > %Folder%\device\meminfo.txt
::获取系统的cup信息
adb shell cat /proc/cpuinfo > %Folder%\device\cpuinfo.txt
::获取系统的prop属性信息
adb shell getprop > %Folder%\device\getprop.txt
::获取系统的内存大小信息
adb shell df -h > %Folder%\device\df.txt

::获取系统的当前界面截图
adb shell screencap /mnt/sdcard/Pictures/capture.png
adb pull /mnt/sdcard/Pictures/capture.png %Folder%\capture.png

::获取系统的dumpsys信息,包含dumpsys package XXX的信息
mkdir %Folder%\dumpsys
adb shell dumpsys > %Folder%\dumpsys\dumpsys.txt

::获取系统的缓存日志
adb shell  logcat -v threadtime -d > %Folder%\logcat.txt

::获取系统的各目录下的日志,根据不同系统进适配

::系统Android日志
adb pull   /data/log/android_logs       %Folder%\android_logs
::Dalvik、状态监视调试器、C层代码以及libc的一些问题导致的错误日志
adb pull   /data/tombstones             %Folder%\tombstones
::系统ANR异常日志
adb pull   /data/anr                    %Folder%\anr
::系统内核日志
adb pull   /sys/fs/pstore               %Folder%\pstore
::系统内核应用程序崩溃数据
adb pull   /data/system/dropbox         %Folder%\dropbox
::系统??日志
adb pull   /data/log/reliability        %Folder%\reliability_system
adb pull   /data/vendor/log/reliability %Folder%\reliability_vendor
::系统settings下的system、secure、global等属性
adb pull /data/system/users/0           %Folder%\settings

::获取系统的recovery信息
mkdir %Folder%\recovery
adb pull /splash2/recovery %Folder%\recovery

echo.
echo ==========log抓取完成==========
pause

实用的脚本太多,就不一一列举了, 下面是自己整理的一个脚本包,需要的可以自己下载: https://download.csdn.net/download/wenzhi20102321/15059091

包含主要内容有:

44
44

养成adb脚本的编写,对重复性的adb命令操作有很大作用。

共勉 :多做有意义的是事情。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132687.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用adb logcat命令显示Android设备上的Log日志
  • 一、在cmd窗口查看手机的Log日志
  • 二、adb logcat 详解
    • 1.adn logcat日志格式
      • 2.按级别过滤日志
        • 3.按 tag 和级别过滤日志
          • 4.adb logcat选项解析
          • 三、把日志信息保存到电脑中
          • 四、使用adb logcat总结
          • 五、开发中实用的关于日志脚本
            • 1、清除日志缓存.bat
              • 2、获取日志文件.bat
                • 3、抓取Android整个日志 .bat
                  • 4、获取系统最前端窗口信息.bat
                    • 4、获取全量日志.bat
                    • 共勉 :多做有意义的是事情。
                    相关产品与服务
                    命令行工具
                    腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档