Shell脚本 | 抓取log文件

在安卓应用的测试过程中,遇到 Crash 或者 ANR 后,想必大家都会通过 adb logcat 命令来抓取日志定位问题。如果直接使用 logcat 命令的话,默认抓取出的 log 文件包含安卓运行时产生的所有日志,给快速定位问题增加了时间成本。

这个问题可以通过一个简单的 Shell 脚本来解决,依然只有区区 20 行左右的代码。

脚本的编写思路是这样的:
1、通过 date 命令获取当前时间并赋值给变量 "DATE",格式为 "year/month/day/hour/minutes/second"。这个时间戳可以用来给输出的 log 文件命名,每次运行脚本都是不同的时间点,从而达到区分 log 文件的目的;
2、通过 read 命令读取包名;
3、通过 read 命令读取日志的优先级(V/D/I/W/E/F/S),通常,我们需要的是 E(Error)级别的日志,也就是应用运行时产生的错误信息;
4、运行 adb logcat 命令,将第 3 步中的优先级(priority)作为输入参数来过滤日志,缩小输出日志的大小和范围;
5、运行 adb logcat 命令,不添加筛选条件,输出全部日志以防万一(参考第 7 步);
6、Crash 的信息存在于 log 文件中,而 ANR 的问题则需要 traces 文件。通过 adb pull 命令可将手机中的 /data/anr/traces.txt 文件取出;
7、运行 adb logcat -c 命令。每次获取 log 文件后,清空日志,保持测试机日志环境的干净,方便下次遇到问题后的日志获取和问题定位。

以下为编写好的脚本:

#!/bin/bash
DATE=$(date "+%Y%m%d%H%M%S")
# 读取包名
echo -n "Please enter the package name:"
read package_name
# 日志级别:V/D/I/W/E/F/S
echo -n "Please enter the priority of log:"
read priority
# log命令
adb logcat -d -v long "AndroidRuntime:${priority}" "*:S" > ~/Desktop/logg/${package_name}${DATE}.log
adb logcat -d -v threadtime > ~/Desktop/logg/${package_name}${DATE}_all.log
# anr日志
adb pull /data/anr/traces.txt ~/Desktop/logg/
# 清空日志
adb logcat -c

运行示例:

-> ./grab_log.sh 
Please enter the package name:com.baidu.minivideo
Please enter the priority of log:E
/data/anr/traces.txt: 1 file pulled.

欢迎关注微信公众号“测试开发Stack”,更多原创文章第一时间发布!

上一篇:android – 如果需要8k-char缓冲区,最好是明确的. [错误]


下一篇:android – logcat中的WARN ResourceType:对于资源…,条目索引(…)超出类型entryCount(1)