adb logcat *:E >/Volumes/D/ps/err2.log
^Z
https://blog.csdn.net/wenzhi20102321/article/details/81058196
查看手机崩溃日志
安装是fatal开头的是崩溃的日志
使用adb logcat命令显示Android设备上的Log日志
使用adb logcat命令显示Android设备上的Log日志
有时候我们在手机程序上的日志要在其他地方调试,然后要看里面的Log日志。
本文教大家如何在不需要studio就可以查看手机程序中的Log日志。
实现这个功能的前提是使用adb命令,所以必须要有手机和电脑,还有安装adb,adb程序是很小的几M就可以。
一、在cmd窗口查看手机的Log日志
在确定连上手机后(adb device,可以看到电脑连接的手机)
在cmd窗口中输入如下命令,就可以像Studio中的Logcat窗口中显示日志信息:
//格式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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
这时手机日志更新什么日志,cmd窗口也会同步更新数据。
但是这样没有过滤条件,如果Log日志很多,很难找到我们想要的信息,
当然也可以复制cmd中的数据到一个文本中慢慢处理的,就是效率不高。
下面介绍adb logcat中的详细参数命令以及如何才能高效的打印日志,或者把日志保存到我们指定的位置。
二、adb logcat 详解
adb logcat如果用过,但是具体命令又不记得
可以输入adb logcat -help,查看一下一些简单的数据格式:
但是,没用过adb logcat,对于上面的指令也是不知所以然的。可以先看看后面的介绍。
1.adn logcat日志格式
adb logcat [<option>] ... [<filter-spec>] ...
adb logcat [选项...] [过滤项...],
- 1
- 2
- 3
前面那些-s,-v就是选项,后面那些V、D、I、W、E、F、S是级别过滤项,同一个tag只能有一个过滤项,多个tag可以有多个过滤项。
先介绍过滤项,这个比较简单,后面在介绍选项
2.按级别过滤日志
格式:
adb logcat <tag>[:priority]
- 1
- 2
tag表示标签,priority输出的级别
日志默认级别是V,如果错误日志我们选择E就可以。
Android 的日志分为如下几个优先级(priority):
V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不输出)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
adb logcat *:W
- 1
其实*可以是某个tag,如果没有指明,就表示所有。
会将 Warning、Error、Fatal 和 Silent 日志输出。
(注: 在 macOS 下需要给 :W 这样以 * 作为 tag 的参数加双引号,如 adb logcat ":W",不然会报错 no matches found: *:W。)
3.按 tag 和级别过滤日志
可以由多个 [:priority] 组成。
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
- 1
表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
###但是我发现自己使用tag标签命令,并没有成功过滤。并且使用tag后,后面的级别也无效了,所以tag使用*号比较保险。
4.adb logcat选项解析
--"-s"选项 : 设置输出日志*:s的标签, 只显示该标签的日志;
--"-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
--"-r"选项 : 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
--"-n"选项 : 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
--"-v"选项 : 设置日志的输出格式, 注意只能设置一项;
--"-c"选项 : 清空所有的日志缓存信息;
--"-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;
--"-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;
--"-g"选项 : 查看日志缓冲区信息;
--"-B"选项 : 以二进制形式输出日志;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
上面很多选项基本是没啥作用的,比如-s相当于过滤*:s的日志,所以是没有日志输出的
这里介绍下用得比较多的选项-v、-c:
(1)adb logcat -v
-v是设置日志的输出格式的
日志支持按以下几种格式 :
①brief
默认格式。格式为:
<priority>/<tag>(<pid>): <message>
- 1
示例:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
- 1
#####②process
格式为:
<priority>(<pid>) <message>
- 1
示例:
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
- 1
#####③tag
格式为:
<priority>/<tag>: <message>
- 1
示例:
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
- 1
#####④raw
格式为:
<message>
- 1
示例:
Disconnected process message: 10, size: 0
- 1
#####⑤time
格式为:
<datetime> <priority>/<tag>(<pid>): <message>
- 1
示例:
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
- 1
#####⑥threadtime
格式为:
<datetime> <pid> <tid> <priority> <tag>: <message>
- 1
示例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
- 1
#####⑦long
格式为:
[ <datetime> <pid>:<tid> <priority>/<tag> ]
- 1
#####⑧
示例:
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
- 1
#####⑨指定格式可与上面的过滤同时使用。比如:
adb logcat -v long ActivityManager:I *:S
- 1
对于-v选项:
如果需要的是普通日志那么使用-v time就可以了,
如果需要查看线程区别使用 -v threadtime就可以了,其他日志基本也是少用的。
(2)adb logcat -c
adb logcat -c是用来清除缓存信息的,这个没有参数
三、把日志信息保存到电脑中
adb logcat最后添加" > 保存文件的地址 "
比如需要将的信息保存到电脑中使用下面的命令:
adb logcat -v time > D:log.txt
- 1
- 2
你就可以在D盘中看到一个log.txt文件,并且里面有之前的日志信息
如果没有指定具体的位置的命令
adb logcat -v time > log.txt
- 1
- 2
这个文件是保存在C盘的用户名的文件夹下的。
四、使用adb logcat总结
常用的其实就两三个命令
1.adb logcat -v time
2.adb logcat -v time > D:log.txt
3.adb logcat -c
- 1
- 2
- 3
- 4
- 5
直接显示日志信息,是会显示很多日志信息的,好像是从设备最近一次开机的日志开始显示
最好的做法的先使用-c清除之前的日志信息,再触发事件,查看最近的日志信息
##下面是我的一个示例:
在MainActivity的生命周期中写几个方法打印Log,清除日志后,运行程序,查看日志文本。
###1.Android代码:
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");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
###2.adb命令和过程,结果
###3.如果把日志直接显示在cmd窗口中
日志窗口是会不断增加的。。。
到这里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
adb logcat -c
- 1
这个脚本是配合下面获取日志的脚本使用的,可以清除之前缓存的数据,只抓取自己当前准备获取的日志信息。
2、获取日志文件.bat
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
- 1
- 2
- 3
- 4
- 5
这个日志在分析问题有一定的作用,哪怕是系统问题也会有日志。
并且这里加入wait-for-device,有些情况可以定位开机就重启或者系统挂的问题。
3、抓取Android整个日志 .bat
获取Android整个日志文件,这个是需要root权限的
adb pull /data/log/android_logs/
pause
- 1
- 2
- 3
4、获取系统最前端窗口信息.bat
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
- 1
- 2
- 3
- 4
这个脚本可以获取当前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权限的,
因为有些文件目录普通用户是获取不到的
@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%deviceps.txt
::获取系统的cup等占用情况
adb shell top -b -n 1 > %Folder%device op.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 op2.txt
::获取系统的进程内核信息
adb shell cat /proc/cmdline > %Folder%devicecmdline.txt
::获取系统的进程内存占用信息
adb shell cat /proc/meminfo > %Folder%devicememinfo.txt
::获取系统的cup信息
adb shell cat /proc/cpuinfo > %Folder%devicecpuinfo.txt
::获取系统的prop属性信息
adb shell getprop > %Folder%devicegetprop.txt
::获取系统的内存大小信息
adb shell df -h > %Folder%devicedf.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%dumpsysdumpsys.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% ombstones
::系统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%
eliability_system
adb pull /data/vendor/log/reliability %Folder%
eliability_vendor
::系统settings下的system、secure、global等属性
adb pull /data/system/users/0 %Folder%settings
::获取系统的recovery信息
mkdir %Folder%
ecovery
adb pull /splash2/recovery %Folder%
ecovery
echo.
echo ==========log抓取完成==========
pause
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
实用的脚本太多,就不一一列举了,
下面是自己整理的一个脚本包,需要的可以自己下载:
https://download.csdn.net/download/wenzhi20102321/15059091
包含主要内容有:
养成adb脚本的编写,对重复性的adb命令操作有很大作用。
共勉 :多做有意义的是事情。
-
谭振子:使用tag以后级别失效的原因是没有加上*:S。不加静默所有其他日志的选项就会把其他日志都输出。参考文档:https://developer.android.google.cn/studio/command-line/logcat8 月前回复
1
-
ikuss:做个补充: Windows上关闭:taskkill /F /IM adb.exe Linux上关闭:kill -9 $(ps aux | grep "adb logcat" | sed -n 1p | awk '{print $2}')1 月前回复
-
若晓梦:你好,请问一下日志中有点击屏幕的信息吗?就是说什么时间点击屏幕2 月前回复
-
lian@qiao:怎么查看指定APP的日志呢1 年前回复
-
-
码哥
峥嵘life
回复:过滤日志吧 或者抓整个文件日志,查看APP的包名,查看进程,搜索所以和进程相关的日志,就是APP相关的日志1 年前回复
-
-
fin_123:good2 年前回复
-
码哥
edaplayer:加-s就没问题了: adb logcat -s ActivityManager:I2 年前回复
-
-
码哥
edaplayer回复:首先filterspecs肯定是有用的,*:S是不打印其他tag的信息,那么如果只想打印tagA的信息,必须要在最后加上*:S adb logcat tagA:I *:S -s选项就相当于在最后面加上过滤项 *:S2 年前回复
-
-
qweenhool:我也是使用tag后级别失效了。。2 年前回复
-
yumi_huang:图都裂了。。2 年前回复
-
-
码哥
峥嵘life
回复:你网络不好,或者csdn服务器有时候有问题2 年前回复
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
热门文章
分类专栏
adb2篇
android284篇
C语言基础6篇
java103篇
java集合4篇
java IO8篇
数据库3篇
人生感言13篇
Socket编程2篇
面试13篇
java多线程6篇
Android文件资源使用11篇
UI43篇
Andr图形和动画7篇
Android多媒体3篇
工具类14篇
android数据7篇
消息处理机制7篇
广播接收者1篇
安卓服务2篇
Android网络24篇
传感器1篇
框架模式2篇
插件4篇
网络框架16篇
高级控件13篇
xutils3篇
Fragment4篇
Vitamio1篇
百度地图开发2篇
设计模式21篇
ps17篇
webservice3篇
报错情况3篇
dicom图像文件6篇
kotlin15篇
Android系统2篇
书籍品读1篇
音频视频4篇
apk9篇
最新评论
- Android对话框的使用总结
love&peace&sleep: 好的谢谢回复!
- 集合和数组的相互转换
Tisfy: 写得太好了!正如那:纸上得来终觉浅,绝知此事要躬行。
- System.arraycopy的使用方法详解
- Android对话框的使用总结
峥嵘life: 没看到设置图标大小的api 你可以不用Dialog默认的标题栏,自己用自定义View,就可以控制大小。
- Java IO流经典练习题
洋洋990: 不能遍历,必须要用object