⑴ android 日誌系統分析(二):logd
logd 守護進程是日誌系統的管家,內部維持三個日誌 Socket : logd、logdr、logdw 來與客戶端進行通信。同時負責維護幾個環形緩沖區,用於存放系統中的各種日誌,緩沖區包含 main、system、events、radio、crash、kernel ;但是在 Android 5.0 之前, logd 進程並不存在,日誌是保留在 /dev/log/main、/dev/log/system、/dev/log/radio、/dev/log/event 等節點中,但是這樣面臨的一個問題就是當 Android 系統大版本升級時, linux kernel 需要升級對應的日誌驅動,因此在後續的版本中就有了 logd 進程。
在 Android 日誌系統分析(一):概述 一文中,總結了整個日誌讀寫的主要流程,因此對於 logd 進程是如何同外界溝通進而讀寫日誌的過程不再贅述,而著重於 logd 本身的一些知識點,這里先看一下 logd 的系統框圖:
知識點:
① logd 是日誌系統的核心進程,由 init 啟動,是屬於守護進程常駐後台
② logd 維護各個日誌節點緩存隊列,提供 socket 介面進行讀、寫、控制功能
③ logd 進程啟動後,分別啟動 LogReader、LogListener、CommandListener 三個線程,監聽並處理來自三個 socket 的消息。在收到消息後,會通過 LogBuffer 類保存日誌到對應的 RAM buffer 中
④ LogAudit 模塊用於接收 Kernel selinux 信息,即可以在用戶空間列印 selinux 日誌信息
⑤ LogKlog 用於接收 kernel 日誌信息,通過設置 property ,可以通過 logcat 命令讀取內核日誌
⑥ LogStatistics 是日誌統計模塊,默認開啟統計數據較少,僅能以 pid/uid 緯度統計列印日誌的數量。如果設置了 logd.statistic = true 。會列印更多緯度的統計信息,包括哪些 pid/uid/tid/TAG 日誌量比較大,可用於日誌裁剪相關
在 main 函數中,會打開 /dev/kmsg 來讀取內核日誌,通過 LogKlog 來進行存儲;若是配置了 ro.logd.kernel 屬性,則打開 /proc/kmsg 讀取內核日誌;
logd 作為 Native Service ,系統啟動時會讀取 init.rc 腳本去啟動,它的相關屬性被定義在 logd.rc 文件中:
這里主要分為兩部分: 啟動 logd 服務 和 啟動 logd-reinit 服務 (在Android 10 上添加了 logd-auditctl 服務,目的是為了限制 selinux denia列印日誌為5秒一次);先來看一下 啟動 logd 服務 的同時做了些什麼:
① 創建 logd、logdr、logdw 這三個 socket 為後面的通信做准備
② logdw 定義為 dgram 類型的 socket ,類似與 UDP類型的 Socket ,這么做的原因是考慮到性能問題,在多個進程同時寫日誌的情況下, write 函數寫入到 socket 的 buffer 中即可返回,這樣不會 block 業務邏輯太長時間。如果是 TCP 類型的 Socket ,客戶端需要等到 TCP 收到 ACK 響應才能返回,這樣就會過多的消耗性能和資源;
啟動 logd-reinit 服務:
這個服務的主要作用是重新初始化 logd 的 LogBuffer,在配置中 oneshot 表示開機只啟動一次。在上面的 main.cpp 中的 main 函數內, logd 在啟動後,會創建一個線程 reinit_thread_start () ,當 logd-reinit 傳入參數 reinit 後,進行功能執行:
① 如果 reinit 啟動後,並且 /deg/kmsg 打開成功,把 logd.daemon: renit 寫入 kmsg
② 重新初始化各個 log buffer 的大小,以及其他參數的初始化,但不會重新生成 LogBuffer 對象
main.cpp##main
main.cpp#reinit_thread_start()
[ 1 ] 深入理解安卓日誌系統(logcat / liblog / logd)
[ 2 ] Android10.0 日誌系統分析(二)-logd、logcat架構分析及日誌系統初始化
⑵ android,log.d()與log.i()什麼區別
1、概念不同
Log.d()是僅輸出debug調試的意思。
Log.i()指一般提示性的消息information。
2、輸出顏色不同
Log.d()的輸出顏色是藍色的。
Log.i()的輸出顏色為綠色。
3、作用不同
Log.d()會輸出上層信息,過濾起來可以通過DDMS的Logcat標簽來選擇;
Log.i()不會輸出Log.v和Log.d的信息,但會顯示i、w和e的信息。
4、列印方法不同
Log.d()列印一些調試信息(logd+tab)。
Log.i()列印一些比較重要的數據,可幫助用戶分析行為數據(logi+tab)。
⑶ 在android程序中,log.w用於輸出什麼級別的日誌信息 a調試 b信息 c警告 d
[W]:警告(Warn)信息,輸出顏色為橙色
在LogCat的右上方的5個字母分別表示了5種不同類型的日誌信息(並以不同顏色加以區分,級別越高,顏色越突出):
1. [V]:詳細(Verbose)信息,輸出顏色為黑色
2. [D]:調試(Debug)信息,輸出顏色是藍色
3. [I]:通告(Info)信息,輸出顏色為綠色
4. [W]:警告(Warn)信息,輸出顏色為橙色
5. [E]:錯誤(Error)信息,輸出顏色為紅色,這里錯誤信息的級別最高,其次是警告信息,然後是通知信息和調試信息,級別最低的是詳細信息。
6.[assert],新版本加入的。