日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Android日志[进阶篇]三-Logcat 命令行工具

發(fā)布時(shí)間:2025/3/12 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android日志[进阶篇]三-Logcat 命令行工具 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android日志[進(jìn)階篇]一-使用 Logcat 寫入和查看日志
Android日志[進(jìn)階篇]二-分析堆棧軌跡(調(diào)試和外部堆棧)
Android日志[進(jìn)階篇]三-Logcat命令行工具
Android日志[進(jìn)階篇]四-獲取錯(cuò)誤報(bào)告
Android日志[進(jìn)階篇]五-閱讀錯(cuò)誤報(bào)告

目錄

  • 日志記錄系統(tǒng)概覽
  • 命令行語(yǔ)法
    • logcat命令行選項(xiàng)
  • 過(guò)濾日志輸出
  • 控制日志輸出格式
  • 格式修飾符
  • 查看備用日志緩沖區(qū)
  • 通過(guò)代碼記錄日志

前言:平常用logcat看日志或copy日志,實(shí)際是在logcat的一個(gè)可視化窗口上進(jìn)行簡(jiǎn)單的read和copy,這個(gè)窗口是由logcat工具支撐的,并不是logcat的全部。

Logcat 是一個(gè)命令行工具,用于轉(zhuǎn)儲(chǔ)系統(tǒng)消息日志,包括設(shè)備拋出錯(cuò)誤時(shí)的堆棧軌跡,以及App使用 Log 類寫入的消息。

本文介紹了命令行 Logcat 工具,但在 Android Studio 中,可以從 Logcat 窗口查看日志消息。如需了解如何在 Android Studio 中查看和過(guò)濾日志,請(qǐng)參閱Android日志[進(jìn)階篇]一-使用 Logcat 寫入和查看日志。

日志記錄系統(tǒng)概覽

Android 日志記錄系統(tǒng)是系統(tǒng)進(jìn)程 logd 維護(hù)的一組結(jié)構(gòu)化環(huán)形緩沖區(qū)。這組可用的緩沖區(qū)是固定的,并由系統(tǒng)定義。最相關(guān)的緩沖區(qū)為:main(用于存儲(chǔ)大多數(shù)應(yīng)用日志)、system(用于存儲(chǔ)源自 Android 操作系統(tǒng)的消息)和 crash(用于存儲(chǔ)崩潰日志)。每個(gè)日志條目都包含一個(gè)優(yōu)先級(jí)(VERBOSE、DEBUG、INFO、WARNING、ERROR 或 FATAL)、一個(gè)標(biāo)識(shí)日志來(lái)源的標(biāo)記以及實(shí)際的日志消息。

日志記錄系統(tǒng)的主接口是共享庫(kù) liblog 及其頭文件 <android/log.h>。所有語(yǔ)言特定的日志記錄工具最終都會(huì)調(diào)用函數(shù) __android_log_write。默認(rèn)情況下,它會(huì)調(diào)用函數(shù) __android_log_logd_logger,該函數(shù)使用套接字將日志條目發(fā)送到 logd。從 API 級(jí)別 30 開始,可通過(guò)調(diào)用 __android_set_log_writer 更改日志記錄函數(shù)。如需了解詳情,請(qǐng)參閱 NDK 文檔。

運(yùn)行 adb logcat 顯示的日志要經(jīng)過(guò)四個(gè)級(jí)別的過(guò)濾:

  • 編譯時(shí)過(guò)濾:根據(jù)編譯設(shè)置,某些日志可能會(huì)從二進(jìn)制文件中完全移除。例如,可以將 ProGuard 配置為從 Java 代碼中移除對(duì) Log.d 的調(diào)用。
  • 系統(tǒng)屬性過(guò)濾:liblog 會(huì)查詢一組系統(tǒng)屬性以確定要發(fā)送到 logd 的最低嚴(yán)重級(jí)別。如果日志具有 MyApp 標(biāo)記,系統(tǒng)會(huì)檢查以下屬性,并且日志應(yīng)包含最低嚴(yán)重級(jí)別的第一個(gè)字母(V、D、I、W、E 或 S 以停用所有日志):
    • log.tag.MyApp
    • persist.log.tag.MyApp
    • log.tag
    • persist.log.tag
  • 應(yīng)用過(guò)濾:如果未設(shè)置任何屬性,liblog 會(huì)使用 __android_log_set_minimum_priority 設(shè)置的最低優(yōu)先級(jí)。默認(rèn)設(shè)置為 INFO。
  • 顯示過(guò)濾:adb logcat 支持其他可減少 logd 顯示的日志數(shù)量的過(guò)濾條件。有關(guān)詳情,請(qǐng)參閱下文。
  • 命令行語(yǔ)法

    如需通過(guò) adb shell 運(yùn)行 Logcat,一般用法如下:

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

    可以將 logcat 作為 adb 命令運(yùn)行,也可以直接在模擬器或關(guān)聯(lián)設(shè)備的 shell 提示中運(yùn)行。如需使用 adb 查看日志輸出,請(qǐng)轉(zhuǎn)到SDK platform-tools/(配置了環(huán)境變量的話,可以直接打開命令行窗口即可運(yùn)行) 目錄并執(zhí)行以下命令:

    adb logcat

    如需獲取 logcat 在線幫助,請(qǐng)啟動(dòng)設(shè)備,然后執(zhí)行以下命令:

    adb logcat --help

    可以建立與設(shè)備的 shell 連接并執(zhí)行以下命令:

    $ adb shell

    logcat命令行選項(xiàng)

    下表介紹了 logcat 的命令行選項(xiàng)。

    選項(xiàng)說(shuō)明
    -b?<buffer>加載可供查看的備用日志緩沖區(qū),例如 events 或 radio。默認(rèn)使用 main、system 和 crash 緩沖區(qū)集。請(qǐng)參閱查看備用日志緩沖區(qū)。
    -c, --clear清除(清空)所選的緩沖區(qū)并退出。默認(rèn)緩沖區(qū)集為 main、system 和 crash。如需清除所有緩沖區(qū),請(qǐng)使用 -b all -c。
    -e <expr>, --regex=<expr>只輸出日志消息與 <expr> 匹配的行,其中 <expr> 是正則表達(dá)式。
    -m <count>, --max-count=<count>輸出 <count> 行后退出。這樣是為了與 --regex 配對(duì),但可以獨(dú)立運(yùn)行。
    --print與 --regex 和 --max-count 配對(duì),使內(nèi)容繞過(guò)正則表達(dá)式過(guò)濾器,但仍能夠在獲得適當(dāng)數(shù)量的匹配時(shí)停止。
    -d將日志轉(zhuǎn)儲(chǔ)到屏幕并退出。
    -f?<filename>將日志消息輸出寫入 <filename>。默認(rèn)值為 stdout。
    -g, --buffer-size輸出指定日志緩沖區(qū)的大小并退出。
    -n?<count>將輪替日志的數(shù)量上限設(shè)置為 <count>。默認(rèn)值為 4。需要使用 -r 選項(xiàng)。
    -r?<kbytes>每輸出 <kbytes> 時(shí)輪替日志文件。默認(rèn)值為 16。需要 -f 選項(xiàng)。
    -s相當(dāng)于過(guò)濾器表達(dá)式 '*:S';它將所有標(biāo)記的優(yōu)先級(jí)設(shè)為“靜默”,并用于放在可添加內(nèi)容的過(guò)濾器表達(dá)式列表之前。如需了解詳情,請(qǐng)轉(zhuǎn)到介紹過(guò)濾日志輸出的部分。
    -v?<format>設(shè)置日志消息的輸出格式。默認(rèn)格式為 threadtime。如需查看支持的格式列表,請(qǐng)參閱介紹控制日志輸出格式的部分。
    -D, --dividers輸出各個(gè)日志緩沖區(qū)之間的分隔線。
    -c清空(清除)整個(gè)日志并退出。
    -t <count> 僅輸出最新的行數(shù)。此選項(xiàng)包括 -d 功能。
    -t '<time>' 輸出自指定時(shí)間以來(lái)的最新行。此選項(xiàng)包括 -d 功能。如需了解如何引用帶有嵌入空格的參數(shù),請(qǐng)參閱 -P 選項(xiàng)。 adb logcat -t '01-26 20:52:41.820'
    -T <count> 輸出自指定時(shí)間以來(lái)的最新行數(shù)。此選項(xiàng)不包括 -d 功能。
    -T '<time>' 輸出自指定時(shí)間以來(lái)的最新行。此選項(xiàng)不包括 -d 功能。如需了解如何引用帶有嵌入空格的參數(shù),請(qǐng)參閱 -P 選項(xiàng)。 adb logcat -t '01-26 20:52:41.820'
    -L, --last在最后一次重新啟動(dòng)之前轉(zhuǎn)儲(chǔ)日志。
    -B, --binary以二進(jìn)制文件形式輸出日志。
    -S, --statistics在輸出中包含統(tǒng)計(jì)信息,以幫助您識(shí)別和定位日志垃圾信息發(fā)送者。
    -G <size> 設(shè)置日志環(huán)形緩沖區(qū)的大小。可以在結(jié)尾處添加 K 或 M,以指示單位為千字節(jié)或兆字節(jié)。
    -p, --prune 輸出(讀取)當(dāng)前的允許 (white) 列表和拒絕 (black) 列表,不采用任何參數(shù),如下所示: adb logcat -p
    -P '<list> ...'
    --prune '<list> ...' -P '<white_and_black_list>'
    寫入(設(shè)置)允許 (white) 列表和拒絕 (black) 列表以出于特定目的調(diào)整日志記錄內(nèi)容。您可以提供允許 (<white>) 列表和拒絕 (~<black>) 列表?xiàng)l目的混合內(nèi)容,其中 <white> 或 <black> 可以是 UID、UID/PID 或 /PID。在 logcat 統(tǒng)計(jì)信息 (logcat -S) 的指導(dǎo)下,您可以考慮出于各種目的調(diào)整允許 (white) 列表和拒絕 (black) 列表,例如:
    • 通過(guò) UID 選擇使特定日志記錄內(nèi)容具有最長(zhǎng)保留期限。
    • 阻止人 (UID) 或物 (PID) 消耗相應(yīng)資源,以幫助增加日志跨度,從而更深入地了解正在診斷的問(wèn)題。

    默認(rèn)情況下,日志記錄系統(tǒng)會(huì)自動(dòng)以動(dòng)態(tài)方式阻止日志統(tǒng)計(jì)信息中最嚴(yán)重的違規(guī)內(nèi)容,以便為新的日志消息騰出空間。一旦它用盡啟發(fā)法,系統(tǒng)便會(huì)刪除最舊的條目,以便為新消息騰出空間。

    添加許可名單 (whitelist) 可保護(hù)您的 Android 識(shí)別碼 (AID),它會(huì)變成進(jìn)程的 AID 和 GID,而不會(huì)被聲明為違規(guī)內(nèi)容;添加拒絕列表有助于在相應(yīng)內(nèi)容被視為最嚴(yán)重的違規(guī)內(nèi)容之前即釋放空間。您可以選擇刪除內(nèi)容的程度和頻率;也可以關(guān)閉刪除功能,這樣,系統(tǒng)便僅會(huì)移除各個(gè)日志緩沖區(qū)中最舊條目的內(nèi)容。

    引號(hào)

    adb logcat 不會(huì)保留引號(hào),因此指定允許 (white) 列表和拒絕 (black) 列表的語(yǔ)法如下所示:

    $ adb logcat -P '"<white_and_blacklist>"' or adb shell $ logcat -P '<white_and_blacklist>'

    以下示例指定了一個(gè)包含 PID 32676 和 UID 675 的允許 (white) 列表,以及一個(gè)包含 PID 32677 和 UID 897 的拒絕 (black) 列表。拒絕列表中的 PID 32677 經(jīng)過(guò)加權(quán)處理,以便可以更快刪除。

    adb logcat -P '"/32676 675 ~/32677 897"'

    其他您可以使用的允許 (white) 列表和拒絕 (black) 列表命令變體如下所示:

    ~! worst uid blacklist ~1000/! worst pid in system (1000)
    --pid=<pid> ...僅輸出來(lái)自給定 PID 的日志。
    --wrap休眠 2 小時(shí)或者當(dāng)緩沖區(qū)即將封裝時(shí)(兩者取其先)。通過(guò)提供即將封裝喚醒來(lái)提高輪詢的效率。

    過(guò)濾日志輸出

    • 日志消息的標(biāo)記是一個(gè)簡(jiǎn)短的字符串,指示消息所源自的系統(tǒng)組件(例如,“View”表示視圖系統(tǒng))。
    • 優(yōu)先級(jí)是以下字符值之一(按照從最低到最高優(yōu)先級(jí)的順序排列):
      • V:詳細(xì)(最低優(yōu)先級(jí))
      • D:調(diào)試
      • I:信息
      • W:警告
      • E:錯(cuò)誤
      • F:嚴(yán)重錯(cuò)誤
      • S:靜默(最高優(yōu)先級(jí),絕不會(huì)輸出任何內(nèi)容)

    通過(guò)運(yùn)行 Logcat 并觀察每條消息的前兩列,您可以獲取系統(tǒng)中使用的帶有優(yōu)先級(jí)的標(biāo)記列表,格式為 <priority>/<tag>。

    以下是使用 logcat -v brief output 命令獲取的簡(jiǎn)短 Logcat 輸出的示例。它表明消息與優(yōu)先級(jí)“I”和標(biāo)記“ActivityManager”相關(guān):

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

    如要將日志輸出降低到可管理的水平,您可以使用過(guò)濾器表達(dá)式限制日志輸出。通過(guò)過(guò)濾器表達(dá)式,您可以向系統(tǒng)指明您感興趣的標(biāo)記/優(yōu)先級(jí)組合,系統(tǒng)會(huì)針對(duì)指定的標(biāo)記抑制其他消息。

    過(guò)濾器表達(dá)式采用 tag:priority ... 格式,其中 tag 指示您感興趣的標(biāo)記,priority 指示可針對(duì)該標(biāo)記報(bào)告的最低優(yōu)先級(jí)。不低于指定優(yōu)先級(jí)的標(biāo)記的消息會(huì)寫入日志。您可以在一個(gè)過(guò)濾器表達(dá)式中提供任意數(shù)量的 tag:priority 規(guī)范。一系列規(guī)范使用空格分隔。

    以下是一個(gè)過(guò)濾器表達(dá)式的示例,該表達(dá)式會(huì)抑制除標(biāo)記為“ActivityManager”、優(yōu)先級(jí)不低于“信息”的日志消息,以及標(biāo)記為“MyApp”、優(yōu)先級(jí)不低于“調(diào)試”的日志消息以外的所有其他日志消息:

    adb logcat ActivityManager:I MyApp:D *:S

    上述表達(dá)式中最后一個(gè)元素 *:S 將所有標(biāo)記的優(yōu)先級(jí)設(shè)為“靜默”,從而確保系統(tǒng)僅顯示標(biāo)記為“ActivityManager”和“MyApp”的日志消息。使用 *:S 是確保日志輸出受限于您已明確指定的過(guò)濾器的絕佳方式,它可以讓過(guò)濾器充當(dāng)日志輸出的“許可名單”。

    以下過(guò)濾器表達(dá)式顯示了優(yōu)先級(jí)不低于“警告”的所有標(biāo)記的所有日志消息:

    adb logcat *:W

    如果從開發(fā)計(jì)算機(jī)運(yùn)行 Logcat(相對(duì)于在遠(yuǎn)程 adb shell 上運(yùn)行),則也可以通過(guò)導(dǎo)出環(huán)境變量 ANDROID_LOG_TAGS 的值設(shè)置默認(rèn)過(guò)濾器表達(dá)式:

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

    請(qǐng)注意,如果從遠(yuǎn)程 shell 或使用 adb shell logcat 運(yùn)行 Logcat,系統(tǒng)不會(huì)將 ANDROID_LOG_TAGS 過(guò)濾器導(dǎo)出到模擬器/設(shè)備實(shí)例。

    控制日志輸出格式

    除標(biāo)記和優(yōu)先級(jí)外,日志消息還包含許多元數(shù)據(jù)字段。您可以修改消息的輸出格式,以便它們顯示特定的元數(shù)據(jù)字段。為此,您可以使用 -v 選項(xiàng),并指定下列某一受支持的輸出格式。

    • brief:顯示優(yōu)先級(jí)、標(biāo)記以及發(fā)出消息的進(jìn)程的 PID。
    • long:顯示所有元數(shù)據(jù)字段,并使用空白行分隔消息。
    • process:僅顯示 PID。
    • raw:顯示不包含其他元數(shù)據(jù)字段的原始日志消息。
    • tag:僅顯示優(yōu)先級(jí)和標(biāo)記。
    • thread::舊版格式,顯示優(yōu)先級(jí)、PID 以及發(fā)出消息的線程的 TID。
    • threadtime(默認(rèn)值):顯示日期、調(diào)用時(shí)間、優(yōu)先級(jí)、標(biāo)記、PID 以及發(fā)出消息的線程的 TID。
    • time:顯示日期、調(diào)用時(shí)間、優(yōu)先級(jí)、標(biāo)記以及發(fā)出消息的進(jìn)程的 PID。

    啟動(dòng) Logcat 時(shí),您可以使用 -v 選項(xiàng)指定所需的輸出格式:

    [adb] logcat [-v <format>]

    以下示例顯示了如何生成輸出格式為 thread 的消息:

    adb logcat -v thread

    請(qǐng)注意,您只能使用 -v 選項(xiàng)指定一種輸出格式,但可以指定任意數(shù)量的有意義的修飾符。Logcat 會(huì)忽略沒(méi)有意義的修飾符。

    格式修飾符

    格式修飾符依據(jù)以下一個(gè)或多個(gè)修飾符的任意組合更改 Logcat 輸出。如要指定格式修飾符,請(qǐng)使用 -v 選項(xiàng),如下所示:

    adb logcat -b all -v color -d

    每個(gè) Android 日志消息都有一個(gè)與之相關(guān)聯(lián)的標(biāo)記和優(yōu)先級(jí)。可以將任何格式修飾符與以下任一格式選項(xiàng)進(jìn)行組合:brief、long、process、raw、tag、thread、threadtime 和 time。

    可以通過(guò)在命令行中輸入 logcat -v --help 獲取格式修飾符詳細(xì)信息。

    • color:使用不同的顏色來(lái)顯示每個(gè)優(yōu)先級(jí)。
    • descriptive:顯示日志緩沖區(qū)事件說(shuō)明。此修飾符僅影響事件日志緩沖區(qū)消息,不會(huì)對(duì)其他非二進(jìn)制文件緩沖區(qū)產(chǎn)生任何影響。事件說(shuō)明取自 event-log-tags 數(shù)據(jù)庫(kù)。
    • epoch:顯示自 1970 年 1 月 1 日以來(lái)的時(shí)間(以秒為單位)。
    • monotonic:顯示自上次啟動(dòng)以來(lái)的時(shí)間(以 CPU 秒為單位)。
    • printable:確保所有二進(jìn)制日志記錄內(nèi)容都進(jìn)行了轉(zhuǎn)義。
    • uid:如果訪問(wèn)控制允許,則顯示 UID 或記錄的進(jìn)程的 Android ID。
    • usec:顯示精確到微秒的時(shí)間。
    • UTC:顯示 UTC 時(shí)間。
    • year:將年份添加到顯示的時(shí)間。
    • zone:將本地時(shí)區(qū)添加到顯示的時(shí)間。

    查看備用日志緩沖區(qū)

    Android 日志記錄系統(tǒng)為日志消息保留了多個(gè)環(huán)形緩沖區(qū),而且并非所有的日志消息都會(huì)發(fā)送到默認(rèn)的環(huán)形緩沖區(qū)。如要查看其他日志消息,您可以使用 -b 選項(xiàng)運(yùn)行 logcat 命令,以請(qǐng)求查看備用的環(huán)形緩沖區(qū)。您可以查看下列任意備用緩沖區(qū):

    • radio:查看包含無(wú)線裝置/電話相關(guān)消息的緩沖區(qū)。
    • events:查看已經(jīng)過(guò)解譯的二進(jìn)制系統(tǒng)事件緩沖區(qū)消息。
    • main:查看主日志緩沖區(qū)(默認(rèn)),不包含系統(tǒng)和崩潰日志消息。
    • system:查看系統(tǒng)日志緩沖區(qū)(默認(rèn))。
    • crash:查看崩潰日志緩沖區(qū)(默認(rèn))。
    • all:查看所有緩沖區(qū)。
    • default:報(bào)告 main、system 和 crash 緩沖區(qū)。

    以下是 -b 選項(xiàng)的用法:

    [adb] logcat [-b <buffer>]

    以下示例顯示了如何查看包含無(wú)線裝置和電話相關(guān)消息的日志緩沖區(qū)。

    adb logcat -b radio

    此外,也可以為要輸出的所有緩沖區(qū)指定多個(gè) -b 標(biāo)記,如下所示:

    logcat -b main -b radio -b events

    可以指定一個(gè) -b 標(biāo)記,后跟緩沖區(qū)逗號(hào)分隔列表,例如:

    logcat -b main,radio,events

    通過(guò)代碼記錄日志

    通過(guò) Log 類,您可以在代碼中創(chuàng)建日志條目,而這些條目會(huì)顯示在 Logcat 工具中。常用的日志記錄方法包括:

    • Log.v(String, String)(詳細(xì))
    • Log.d(String, String)(調(diào)試)
    • Log.i(String, String)(信息)
    • Log.w(String, String)(警告)
    • Log.e(String, String)(錯(cuò)誤)

    例如,使用以下調(diào)用:

    Log.i("MyActivity", "MyClass.getView() — get item number " + position);

    Logcat 輸出類似如下:

    I/MyActivity( 1557): MyClass.getView() — get item number 1

    總結(jié)

    以上是生活随笔為你收集整理的Android日志[进阶篇]三-Logcat 命令行工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。