android log系统

本文深入解析Android日志系统及其logcat命令的使用方法,包括查看和跟踪系统日志缓冲区、过滤日志输出、控制日志样式、查看替代日志缓冲区等。同时,介绍如何在shell命令行中使用grep等工具过滤logcat输出,以及如何在shell文件中输出日志。此外,提供adblogcat命令简单实例和在shell文件中输出log的实践案例。

一、如何使用logcat命令

        查看和跟踪系统日志缓冲区的命令logcat的一般用法是:

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

   下文介绍过滤器和命令选项,详细内容可参见Listing of logcat Command Options

    可以在开发机中通过远程shell的方式使用logcat命令查看日志输出:

$ adb logcat

    如果是在远程shell中可直接使用命令:

# logcat

  过滤日志输出

        每一条日志消息都有一个标记和优先级与其关联。

标记是一个简短的字符串,用于标识原始消息的来源 (例如"View" 来源于显示系统)。

优先级是下面的字符,顺序是从低到高:

V — 明细 (最低优先级)

D — 调试

I — 信息

W — 警告

E — 错误

F — 严重错误

S — 无记载 (最高优先级,没有什么会被记载)

    通过运行logcat ,可以获得一个系统中使用的标记和优先级的列表,观察列表的前两列,给出的格式是<priority>/<tag>。

    这里是一个日志输出的消息,优先级是“I”,标记是“ActivityManager”:

I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}

    如果想要减少输出的内容,可以加上过滤器表达式进行限制,过滤器可以限制系统只输出感兴趣的标记-优先级组合。

      过滤器表达式的格式是tag:priority ... ,其中tag是标记, priority是最小的优先级, 该标记标识的所有大于等于指定优先级的消息被写入日志。也可以在一个过滤器表达式中提供多个这样的过滤,它们之间用空格隔开。

  下面给出的例子是仅输出标记为“ActivityManager”并且优先级大于等于“Info”和标记为“MyApp”并且优先级大于等于“Debug”的日志:

adb logcat ActivityManager:I MyApp:D *:S

    上述表达式最后的 *:S 用于设置所有标记的日志优先级为S,这样可以确保仅有标记为“View”(译者注:应该为ActivityManager,原文可能是笔误)和“MyApp”的日志被输出,使用 *:S 是可以确保输出符合指定的过滤器设置的一种推荐的方式,这样过滤器就成为了日志输出的“白名单”。

    下面的表达是显示所有优先级大于等于“warning”的日志:

adb logcat *:W

    如果在开发用电脑上运行 logcat (相对于运行运程shell而言),也可以通过ANDROID_LOG_TAGS环境变量设置默认的过滤器表达式:

export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

    需要注意的是,如果是在远程shell或是使用adb shell logcat 命令运行logcat , ANDROID_LOG_TAGS 不会导出到模拟器或手机设备上。

  控制日志格式

        日志消息在标记和优先级之外还有很多元数据字段,这些字段可以通过修改输出格式来控制输出结果, -v 选项加上下面列出的内容可以控制输出字段:

brief — 显示优先级/标记和原始进程的PID (默认格式)

process — 仅显示进程PID

tag — 仅显示优先级/标记

thread — 仅显示进程:线程和优先级/标记

raw — 显示原始的日志信息,没有其他的元数据字段

time — 显示日期,调用时间,优先级/标记,PID

long —显示所有的元数据字段并且用空行分隔消息内容

  可以使用 -v启动 logcat来控制日志格式:

[adb] logcat [-v <format>]

  例如使用 thread 输出格式:

adb logcat -v thread

  注意只能在 -v 选项中指定一种格式。

  Viewing Alternative Log Buffers

        Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b 选项,以下是可以指定的缓冲区:

radio — 查看包含在无线/电话相关的缓冲区消息

events — 查看事件相关的消息

main — 查看主缓冲区 (默认缓冲区)

-b 选项的用法:

[adb] logcat [-b <buffer>]

  例如查看radio缓冲区:

adb logcat -b radio

二、如何使用linux的命令(grep等)过滤logcat

本文介绍如何在 shell 命令行中过滤 adb logcat 输出的几个小技巧。

开发当中经常看到别人的 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率。下面是几个我所知道的过滤方法。

1. 只显示需要的输出,白名单

最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配。简单的匹配一行当中的某个字符串,例如 MyApp:

adb logcat | grep MyApp
adb logcat | grep -i myapp #忽略大小写。
adb logcat | grep --color=auto -i  myapp #设置匹配字符串颜色。更多设置请查看 grep 帮助。

进阶一点可以使用 grep 的正则表达式匹配。例如上一个例子会匹配一行中任意位置的 MyApp,可以设置为仅匹配 tag。默认的 log 输出如下,如果修改过输出格式相应的表达式也要修改。

I/CacheService(  665): Preparing DiskCache for all thumbnails.

可以看出 tag 是一行开头的第三个字符开始,根据这点写出表达式:

adb logcat | grep "^..MyApp"

根据这个格式也可以设置只显示某个优先级的 log,再匹配行首第一个字符即可。例如仅显示 Error 级别 tag 为 MyApp 的输出:

adb logcat | grep "^E.MyApp"

当然也可以匹配多个,使用 | 分割多个匹配表达式,要加转义符。例如要匹配 tag 为 MyApp 和 MyActivity 的输出:

adb logcat | grep "^..MyApp\|^..MyActivity"
adb logcat | grep -E "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符

2. 过滤不需要的输出,黑名单

还是使用 grep,用法也跟上面的一样,加一个 -v 即可。例如要过滤 tag 为 MyApp 和 MyActivity 的输出:

adb logcat | grep -v "^..MyApp\|^..MyActivity"
adb logcat | grep -vE "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符

3. 显示同一个进程的所有输出

有时一个程序里面的 tag 有多个,需要输出该程序(同一个 PID)的所有 tag;仅使用 tag 过滤有时也会漏掉一些错误信息,而一般错误信息也是和程序同一个 PID。还是通过 grep 实现,思路是先根据包名找到 pid 号,然后匹配 pid。写成 shell 脚本如下,参数是程序的 java 包名(如 com.android.media)。

1#!/bin/bash
2packageName=$1
3pid=`adb shell ps|grep $packageName | awk '{print $2}'`
4adb logcat | grep--color=auto $pid

4. 从当前开始显示

logcat 有缓存,如果仅需要查看当前开始的 log,需要清空之前的。

adb logcat -c && adb logcat

5. 过滤 log 文件

有时需要分析 log 文件,过滤 log 文件还是使用 grep。例如 log 文件为 myapp.log,要匹配 tag 为 MyApp 和 MyActivity 的输出,然后输出到 newmyapp.log:

cat myapp.log | grep "^..MyApp\|^..MyActivity" > newmyapp.log

Windows 下推荐使用 Notepad++,一个免费强大的记事本,支持正则表达式查找替换。可以高亮显示匹配内容,也可以删除不需要的内容。

以上的技巧主要用到了 grep,其实 logcat 本身也有过滤功能,可以根据 tag、优先级过滤 log,具体请参考 Android 官方文档Reading and Writing Logs。如果喜欢使用图形界面,请参考Using DDMS,DDMS 里面的 logcat 也可以同样过滤。

三、如何在shell文件中输出log

system/core/rootdir/etc/init.qcom.rc

service pre_apk /system/bin/sh /system/etc/pre_apk.sh
    class late_start
    user root
    oneshot


/system/etc/pre_apk.sh

#!/system/bin/sh

LOG_TAG="apk"
LOG_NAME="copyApk"

loge ()
{
  /system/bin/log -t $LOG_TAG -p e "$LOG_NAME $@"  #-t 标识tag,-p 标识proprietry
}
logi ()
{
  /system/bin/log -t $LOG_TAG -p i "$LOG_NAME $@"
}
logi "In APK shell Script"

loge "my Test"

开机后就可以查看上面的log输出来判断pre_apk.sh是否执行

 adb shell logcat -v time apk:I *:S
--------- beginning of /dev/log/system
--------- beginning of /dev/log/main
06-20 15:48:17.740 I/apk     (  138): copyApk In APK shell Script
06-20 15:48:17.780 E/apk     (  143): copyApk my Test
06-20 15:48:17.810 I/apk     (  147): copyApk copy apks 


 通过这个还可以知道logcat的输出是由  /system/bin/log 这个可执行文件来执行的

四、adb logcat简单举例

1.$ adb logcat-c && adb logcat -v time Sensors:V *:S

--------- beginning of /dev/log/main

05-30 10:04:06.779 E/Sensors ( 208):(code=EVENT_TYPE_PITCH,mPendingEvents[Orientation].orientation.pitch=1.930000)

05-30 10:04:06.799 E/Sensors ( 208):(code=EVENT_TYPE_PITCH,mPendingEvents[Orientation].orientation.pitch=1.750000)

05-30 10:04:06.839 E/Sensors ( 208):(code=EVENT_TYPE_PITCH,mPendingEvents[Orientation].orientation.pitch=1.930000)

05-30 10:04:06.879 E/Sensors ( 208):(code=EVENT_TYPE_PITCH,mPendingEvents[Orientation].orientation.pitch=1.750000)


2、导入日志到sd卡


五、sprd Tcard logs4android的使用

T卡打log是通过shell脚本来完成的,shell脚本

3rdparty/tools/tools-binary/special/tools/logs4android.sh

系统启动时开启了service

service logs4android /system/bin/logwrapper /system/xbin/logs4android.sh ^^ ^eng
#   disabled

可以看到此shell脚本由logwrapper来执行,logwrapper是android本身的东西

在默认情况下,程序在被init执行时会将标准输出和标准错误(如c文件中的printf,sh文件中的echo)都重定向到/dev/null(丢弃)。若你想要获得调试信息,你可以通过Andoird系统中的logwrapper程序执行你的程序。它会将标准输出/标准错误都重定向到Android日志系统(通过logcat访问)。

例如:    service akmd /system/bin/logwrapper /sbin/akmd

/logs4android.sh 也是通过logwrapper来执行的,所以在adb shell ps没有logs4android,只有/system/bin/logwrapper,

但可以通过下面的方法查看

adb shell getprop |grep --color logs*
[init.svc.bootlogo]: [stopped]
[init.svc.logs4android]: [running]  //表示正在运行
[init.svc.logs4modem]: [running]

*#*#83781#*#*

--->app settings--->log settings,uncheck   android log,再次执行adb shell getprop |grep --color logs*

[init.svc.bootlogo]: [stopped]
[init.svc.logs4android]: [stopped] //表示 已经停止
[init.svc.logs4modem]: [running]




<think> 首先,用户的问题是关于Android Log系统Log的使用方法。他们明确提到:“我想获取Android日志(Log系统Log的使用方法”,所以我需要专注于如何在实际开发中使用Log。 我手头有一些站内引用: - 引用[1]:讨论了Android log机制,包括使用ALOGD来打印log- 引用[2]:提到了/system/bin/dumpsys的使用和一些限制。 - 引用[3]:描述了Android中的Log日志系统,包括不同级别的Log(Verbose, Debug, Error, Warning, Info)。 用户的问题是基于这些引用的,所以我应该参考它们,但主要回答要针对Log的使用方法。用户说“上述引用仅供参考”,所以我不能完全依赖它们,而是要综合知识提供准确信息。 我的回答需要遵循系统级指令: - 所有行内数学表达式使用$...$格式(但这里可能不需要数学公式)。 - 独立公式使用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(确保任何公式正确)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 回答结构要清晰,帮助用户逐步解决问题。确保信息真实可靠。 组织回答: 1. **引言**:简要介绍Android Log系统。 2. **如何使用Log**: - 在代码中导入Log类。 - 使用不同级别的Log方法(如Log.v(), Log.d(), Log.i(), Log.w(), Log.e())。 - 解释每个级别的含义: - VERBOSE:用于开发时的详细日志。 - DEBUG:开发时使用,运行时可能被剥离。 - INFO:一般信息。 - WARN:警告。 - ERROR:错误。 - 示例代码。 3. **查看Log**: - 使用logcat命令或Android Studio的Logcat工具。 - 提到dumpsys,但引用[2]说它可能有输出不完整的问题。 4. **最佳实践**: - 不要在发布版本中保留Verbose和Debug日志。 - 使用标签(TAG)来组织日志。 5. **引用相关部分**:在适当的地方添加引用标识。 参考引用: - 引用[1]提到使用ALOGD(这是C++层的,但在Java中常用android.util.Log)。 - 引用[3]提供日志级别的定义:Verbose不应编译到应用中,Debug在运行时被剥离,Error、Warning、Info总是保留。 - 引用[2]关于dumpsys,但它不是直接关于Log的使用方法,而是系统服务日志。 主要焦点应该在android.util.Log的使用上,因为用户问的是“Log的使用方法”。 生成相关问题: - 在回答结束后,添加“相关问题”部分。 - 基于内容,生成3-5个相关问题。 - 例如: 1. 如何在Android Studio中查看Log? 2. Log的级别有哪些区别? 3. 如何过滤Logcat输出? 4. 在发布版本中如何管理日志? 5. 使用Log的常见错误或最佳实践是什么? 确保回答真实可靠:基于我对Android开发的知识,Log类是常用的。方法如Log.d(TAG, "message")。 完整回答结构: - 开头解释Log系统- 步骤式解释使用方法。 - 代码示例。 - 查看日志的方法。 - 注意事项。 - 相关问题。 添加引用: - 当提到日志级别时,引用引用[3]。 - 如果提到ALOGD或底层机制,引用引用[1]。 - dumpsys相关引用引用[2]。 最终,回答问题:"Android Log系统Log的使用方法"。 </think> ### Android Log系统Log的使用方法 Android Log系统是开发过程中用于输出调试信息、错误日志等的重要工具,主要通过`android.util.Log`类实现。它支持不同级别的日志,帮助开发者追踪应用行为。以下我将逐步解释Log的使用方法,包括代码示例、查看日志的方式和最佳实践。参考站内引用,Log级别在开发中需谨慎选择[^3]。 #### 1. **导入Log类和基本使用** - 在Java或Kotlin代码中,首先导入`android.util.Log`类。 - 使用不同级别的Log方法输出日志,每个方法有两个参数:标签(`TAG`)和消息(`message`)。标签用于过滤日志,通常定义为类名或自定义字符串。 - 示例代码(以Java为例): ```java import android.util.Log; public class MyActivity extends AppCompatActivity { private static final String TAG = "MyActivity"; // 定义标签 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 输出不同级别的日志 Log.v(TAG, "这是Verbose日志:详细调试信息"); // Verbose级别,仅开发时使用 Log.d(TAG, "这是Debug日志:程序运行状态"); // Debug级别,开发时保留,运行时可能被剥离 Log.i(TAG, "这是Info日志:一般信息"); // Info级别,总是保留 Log.w(TAG, "这是Warn日志:警告信息"); // Warn级别,总是保留 Log.e(TAG, "这是Error日志:错误信息"); // Error级别,总是保留 } } ``` - **关键点**: - **Verbose (Log.v)**:用于开发时的详细调试信息,不应编译到发布版本中[^3]。 - **Debug (Log.d)**:开发时使用,在发布版本中可能会被移除或忽略[^3]。 - **Info (Log.i)**、**Warn (Log.w)**、**Error (Log.e)**:这些日志在运行时总是保留,适合记录重要事件或错误。 #### 2. **日志级别含义和选择** - Log级别帮助过滤和优先处理日志。参考引用[^3],级别定义如下: - **VERBOSE**:最详细的日志,仅在开发阶段使用。 - **DEBUG**:调试信息,开发时编译入应用,但运行时可能被剥离以减少性能开销。 - **INFO**:常规信息,如应用启动或用户操作。 - **WARN**:潜在问题警告,不影响应用运行。 - **ERROR**:严重错误,可能导致应用崩溃。 - **最佳实践**: - 在开发阶段使用Verbose和Debug级别追踪细节。 - 在发布版本中,通过ProGuard或代码优化移除Verbose和Debug日志,避免泄露敏感信息[^3]。 - 使用唯一标签(如类名)便于在Logcat中过滤。 #### 3. **查看和过滤日志** - **使用Logcat工具**:在Android Studio中,通过“Logcat”窗口实时查看日志。支持按标签、级别或关键字过滤。 - 打开Android Studio → 底部菜单选择“Logcat” → 选择设备和应用进程。 - **命令行方式**:使用`adb logcat`命令查看设备日志。 - 示例命令: ```bash adb logcat -s MyActivity:I # 只显示标签"MyActivity"的Info及以上级别日志 ``` - 常用参数:`-s` 过滤标签,`-v` 设置格式(如`-v time`显示时间戳)。 - **系统级日志工具**:如`dumpsys`,它可以输出系统服务日志,但可能存在输出不完整的问题(需修改时间参数以确保完整)[^2]。不过,对于应用级日志,推荐优先使用Logcat。 #### 4. **注意事项和高级技巧** - **性能影响**:过度输出日志可能降低应用性能。建议在关键路径限制Verbose和Debug日志。 - **条件日志**:只在需要时输出日志,避免生产环境问题。 ```java if (BuildConfig.DEBUG) { Log.d(TAG, "调试信息:仅在调试模式输出"); } ``` - **日志持久化**:对于重要错误,可将日志写入文件或发送到服务器(使用`Log.e`结合异常处理)。 - **底层日志机制**:在Native代码中,可使用ALOGD等宏(如引用[^1]所述),但Java层推荐`android.util.Log`。 通过以上步骤,您可以高效使用Android Log系统进行调试和监控。记住,合理管理日志级别是优化应用的关键[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值