App logcat日志分析

本文详细解析了Android日志系统Logcat的工作原理,包括日志缓冲区定义、常见日志类型如radio、system、events、main,以及如何通过命令行查看和过滤日志。介绍了日志的五部分组成,时间、优先级、标签、PID和内容,并提供了实用的logcat命令示例。

logcat日志文件

android日志系统提供了记录和查看系统调试信息的功能,日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来查看和使用,命令为:

adb logcat [<option>]...[<fiter-spec>]..

开发者选项中有个叫日志记录缓冲区大小,默认是256k,也就是超过了256k就要清理掉旧数据

那么缓冲区是如何定义的

缓冲区

由于logcat输出量巨大,特别是信息系统的log,因此,android把log输出到不同的缓冲区,目前定义了4个缓冲区:
1、radio:输出通信系统的log(手机里与通信相关的,例如wifi,345G,蓝牙,gps)
2、system:输出系统组件的log(例如调用摄像头,麦克风)
3、events:输出event模块的log(触摸事件,按键事件等)
4、main:输出所有java层的log(不包括以上)
如果我们想查看通讯的log日志
那么

adb logcat -b radio >d:\radio_log.log

在这里插入图片描述
我们平时使用main就可以了,main就是默认,咱们不指定模块就是system和main,所以我们平时用的应该是这个样子的
在这里插入图片描述
可能大部分人第一次看都是想 这是什么鬼 看不懂啊
那么咱们来慢慢解析
日志分5部分
1、写下日志时的时间
2、优先级
优先级是下面的字符,顺序是从低到高:
V — 明细 verbose(最低优先级)
D — 调试 debug
I — 信息 info
W — 警告 warn
E — 错误 error
F — 严重错误 fatal
S — 无记载 silent

标记是一个简短的字符串,用于标识原始消息的来源。如下是一个日志输出的消息,优先级是“D”,标记是“PowerManagerService”:

D/PowerManagerService( 305): onSensorChanged: light value: 306.0
使用logcat命令查看android日志输出:

adb logcat //显示全部日志
adb logcat > c:\test.log //将日志保存到文件test.log

根据tag标记和级别过滤日志输出:

仅输出标记为“ActivityManager”且优先级大于等于“Info”和标记为“PowerManagerService”并且优先级大于等于“Debug”的日志:

adb logcat ActivityManager:I PowerManagerService:D *:S

注:*:S用于设置所有标记的日志优先级为S,这样可以确保仅输出符合条件的日志。

adb logcat *:W //显示所有优先级大于等于“warning”的日志

adb logcat -s PowerManagerService //显示PowerManagerService的日志信息
3、标签(tag),标明日志发起者和方便日志过滤
4、PID 进程号
5、正文 日志主体内容
说道时间,时间咱刚才的日志也没有啊,加上-v time即可

adb logcat -v time -b radio >d:\radio_log.log

在这里插入图片描述
对上了吧这回

那么我们要观察优先级,重要的是W和E,我们重点观察E,也就是错误的日志,那么分为几种:
1、内存泄露
2、内存溢出
3、内存抖动
4、崩溃
5、ANR

我们主要说崩溃和ANR
崩溃我们就直接在日志中搜索Crash关键字,保险的话搜索FATAL EXCEPTION关键字(表示出现严重错误),之下所有同级别的日志都需要截取,发给开发

ANR:我们在日志中所有ANR in关键字,在发生ANR之前会将anr信息写在/data/anr/traces.txt中将其中的日志发送给开发,这记录最近一次anr,多次的话/data/system/dropbox,其中会有多种异常信息

<think>好的,用户现在想了解如何使用logcat查看Android应用的日志输出。之前我已经给出了关于adb logcat的详细步骤,现在用户可能希望更具体地针对应用日志进行过滤或操作。需要结合用户提供的引用内容,其中提到使用Logcat写入和查看日志,以及性能影响。 首先,用户的问题可能是在发过程中需要实时监控自己的应用日志,或者调试问题。他们可能已经知道基本命令,但需要更精准的过滤方法,比如按包名、标签或优先级过滤。 用户提供的引用[1]提到在Android Studio中使用Logcat,但用户现在询问的是命令行工具adb logcat。需要确保回答覆盖命令行方法,同时可能提及Android Studio的Logcat作为补充,但重点在adb。 接下来,回顾之前的回答,用户已经了解基本命令、保存日志缓冲区选择、标签和优先级过滤、包名过滤等。用户现在的问题更具体,可能希望步骤更清晰,或者有新的过滤方式,比如按时间戳或进程ID。 需要确保回答结构清晰,分步骤说明,并包含常用过滤技巧。同时,引用中的注意事项,如日志对性能的影响,应该在适当的地方提醒用户,尤其是在生产环境中避免过多日志。 可能用户的需求还包括如何高效地查找错误日志,比如崩溃信息,或者如何持续监控日志。需要检查之前的回答是否覆盖这些点,或是否需要补充。 后,生成相关问题时要考虑用户可能遇到的后续问题,比如如何过滤特定时间段的日志,如何解析崩溃堆栈,或者如何结合其他工具分析日志。这些问题需要与当前主题紧密相关,帮助用户深入使用logcat。</think>#### 如何通过 `adb logcat` 查看 Android 应用日志? --- ### **1. 基础命令** #### **实时显示所有日志** ```bash adb logcat ``` - **按 `Ctrl+C` 停止输出** - **清空日志缓存**:`adb logcat -c` [^1] --- ### **2. 按应用包名过滤** #### **方法一:通过进程ID过滤**(需应用已启动) ```bash adb logcat --pid=$(adb shell pidof -s com.example.app) ``` - `pidof -s` 返回指定包名的进程ID,需替换 `com.example.app` 为实际包名[^2] #### **方法二:动态过滤** ```bash adb logcat | grep "$(adb shell pidof com.example.app)" ``` - **Linux/macOS** 使用 `grep`,**Windows** 用 `findstr` - 若应用未启动,需先启动应用以获取进程ID --- ### **3. 按标签(Tag)和优先级过滤** #### **语法格式** ```bash adb logcat <TAG>:<PRIORITY> *:S ``` - **示例**:仅显示 `ActivityManager` 的 `INFO` 及以上日志,并静默其他标签 ```bash adb logcat ActivityManager:I *:S ``` - **优先级等级**:`V`(Verbose)、`D`(Debug)、`I`(Info)、`W`(Warn)、`E`(Error)、`F`(Fatal)[^3] --- ### **4. 按关键字过滤** #### **包含关键字** ```bash adb logcat | grep "LoginActivity" ``` #### **排除关键字** ```bash adb logcat | grep -v "System.out" ``` - **Windows** 使用 `findstr /v` 代替 `grep -v` --- ### **5. 查看崩溃日志** #### **直接访问崩溃缓冲区** ```bash adb logcat -b crash ``` - 显示应用崩溃时的堆栈信息(如 `NullPointerException`)[^4] #### **过滤崩溃关键字** ```bash adb logcat | grep -E "Exception|Error" ``` --- ### **6. 保存日志到本地** #### **实时保存(持续写入)** ```bash adb logcat > app_log.txt ``` #### **转存当前日志后退出** ```bash adb logcat -d > app_log.txt ``` - `-d` 表示转存后终止命令[^1] --- ### **7. 高级用法** #### **按时间范围过滤** ```bash adb logcat -t '01-23 14:30:00.000' -T '01-23 15:00:00.000' ``` - `-t` 指定始时间,`-T` 指定结束时间(格式 `MM-DD hh:mm:ss.xxx`) #### **显示日志时间戳** ```bash adb logcat -v time ``` - 输出格式:`01-23 14:30:00.123 I/TAG: Message`[^3] --- ### **注意事项** 1. **发与生产环境分离** 调试日志(`Log.d()`)应在发布版本中移除,避免性能损耗[^1]。 2. **日志缓冲区限制** Android 默认循环覆盖旧日志,及时保存关键信息。 3. **跨设备连接** 多设备时需指定设备序列号:`adb -s <device-id> logcat` --- ### **相关问题** 1. 如何通过 `adb logcat` 过滤特定时间段的日志? 2. 日志中 `FATAL` 和 `ERROR` 级别的区别是什么? 3. 如何解析 `adb logcat` 输出的 ANR(应用无响应)信息? 4. 为什么 `adb logcat -b crash` 有时无法捕获崩溃日志? --- [^1]: 使用 Logcat 写入和查看日志 | Android 发者 [^2]: `pidof` 命令需设备支持 BusyBox 或 Toybox [^3]: Android 日志优先级定义 | Logcat 官方文档 [^4]: 崩溃日志缓冲区仅记录未捕获的异常或 `Log.wtf()` 消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值