瞭解記錄功能

本文說明記錄程序,包括記錄標準、等級規範、 類別、用途和多重堆疊近似值。

記錄標準

登入 Android 的程序相當複雜, 合併於 logcat。主要標準詳細說明如下:

Source 範例 堆疊層級指南
RFC 5424 (syslog 標準) Linux kernel,許多 Unix 應用程式 核心、系統 Daemon
android.util.Log Android 架構 + 應用程式記錄 Android 架構和系統應用程式
java.util.logging.Level Java 的一般記錄 非系統應用程式

圖 1:記錄層級標準。

雖然每項標準的基礎結構相似, 精細調整各項標準中的約略對應值如下:

RFC 5424 等級 RFC 5424 嚴重性 RFC 5424 說明 android.util.Log java.util.logging.Level
0 緊急 系統無法使用 Log.e / Log.wtf SEVERE
1 快訊 你必須立即採取行動 Log.e / Log.wtf SEVERE
2 最高 關鍵條件 Log.e / Log.wtf SEVERE
3 錯誤 錯誤狀況 Log.e SEVERE
4 警告 警告條件 Log.w WARNING
5 通知 正常,但很重要 Log.w WARNING
6 資訊 資訊訊息 Log.i INFO
7 偵錯 偵錯層級訊息 Log.d CONFIGFINE
- - 詳細訊息 Log.v FINER/FINEST

圖 2: syslog、Android 和 Java 記錄層級。

記錄層級規範

我們針對每種記錄標準制定了現行規範。所選記錄 級別須符合適當的使用標準,例如使用 syslog 核心開發標準

記錄層級訂單由多至多顯示,如下圖所示:

ERROR 系統一律會保留這些記錄。
WARN 系統一律會保留這些記錄。
INFO 系統一律會保留這些記錄。
DEBUG 系統會編譯這些記錄檔,但會在執行階段加以移除。
VERBOSE 除了 。

圖 3: android.util.Log

CONFIG 靜態設定訊息的訊息等級
FINE 提供追蹤資訊的訊息層級
FINER 表示非常詳細的追蹤訊息
FINEST 表示非常詳細的追蹤訊息
INFO 資訊訊息的訊息層級
SEVERE 訊息層級表示嚴重失敗
WARNING 指出潛在問題的訊息層級

圖 4: java.util.Logging.Level.

0 緊急 系統無法使用
1 快訊 你必須立即採取行動
2 最高 關鍵條件
3 錯誤 錯誤狀況
4 警告 警告條件
5 通知 正常但重要
6 參考資訊 資訊訊息
7 偵錯 偵錯層級訊息

圖 5: RFC 5424 - 區段 6.2.1

應用程式記錄功能

系統會使用 Log#isLoggable,依 android.util.Log 類別的 TAG 執行選擇性記錄作業, 如下所示:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

記錄檔可在執行階段調整,以提供選定的記錄功能,如圖所示 如下:

adb shell setprop log.tag.FOO_TAG VERBOSE

重新啟動時,系統會重設 log.tag.* 資源。另有 每次重新啟動時都會保留的永久變體。請參閱以下資訊:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Log#isLoggable 檢查會在應用程式的程式碼中留下記錄追蹤記錄。布林值 DEBUG 標記會使用編譯器最佳化功能,採用下列設定: false,如下所示:

private final static boolean DEBUG = false;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

,瞭解如何調查及移除這項存取權。

R8前,您可以透過 ProGuard 規則集移除每個 APK 的記錄功能。 也就是編譯時間以下範例會移除 INFO 層級以下的所有內容 android.util.Log 記錄:

# This allows proguard to strip isLoggable() blocks containing only <=INFO log
# code from release builds.
-assumenosideeffects class android.util.Log {
  static *** i(...);
  static *** d(...);
  static *** v(...);
  static *** isLoggable(...);
}
-maximumremovedandroidloglevel 4

這有助於處理多種應用程式建構類型 (例如 會比較基礎程式碼 預期會相同,但允許的記錄層級不同。煽情露骨內容 必須為應用程式 (尤其是系統) 設定及遵循政策 應用程式),決定建構類型和版本預期對記錄的影響 輸出內容

Android 執行階段 (ART) 的系統記錄

為系統提供多種課程 應用程式和服務:

類別 目的
android.telephony.Rlog 電台記錄
android.util.Log 一般應用程式記錄功能
android.util.EventLog 系統整合商診斷事件記錄
android.util.Slog 平台架構記錄

圖 6:可用的系統記錄類別和用途。

雖然 android.util.Logandroid.util.Slog 使用相同的記錄層級 標準,Slog 是僅供平台使用的 @hide 類別。EventLog 層級會對應至 event.logtags 中的項目 該檔案位於 /system/etc/event-log-tags 中。

原生記錄

在 C/C++ 中記錄會遵循 syslog 標準,且 syslog(2) 會對應至 控制 printk 緩衝區的 Linux 核心 syslog,以及 syslog(3) 則對應至一般系統記錄器Android 會使用 liblog 適用於一般系統記錄的程式庫

liblog 使用下列巨集為子記錄群組提供包裝函式 表單:

[Sublog Buffer ID] LOG [Log Level ID]

例如,RLOGD 對應 [Radio log buffer ID] LOG [Debug Level]。 主要 liblog 包裝函式如下:

包裝函式類別 函式範例
log_main.h ALOGVALOGW
log_radio.h RLOGDRLOGE
log_system.h SLOGISLOGW

圖 7: liblog 包裝函式。

Android 提供更高層級的記錄介面,最受直接歡迎 liblog 用量,如下所示:

程式庫 用量
async_safe 僅適用於從非同步信號安全環境記錄的程式庫
libbase 提供 C++ 串流介面記錄的 Logging 程式庫,類似 Google 式 (glog) 記錄。「libbase」可同時用於外部專案 而且僅適用於使用 libbase_ndk 的應用程式中。

圖 8:更高層級的記錄程式庫。

多重堆疊近似值

由於精細程度和層級意圖不同,因此不會有明確結果 藉此全面比對不同記錄標準舉例來說, 錯誤記錄的 java.util.logging.Levelandroid.util.Log 級別不是 1:1 相符:

java.util.Logging.Level android.util.Log
全部 Log.wtf
全部 Log.e

圖 9:標準 Java 記錄與 Android 中的錯誤等級 。

在這種情況下,請使用個別標準來決定 申請。

進行多個堆疊層級的系統開發期間,請遵循 圖 1 判斷每個元件要使用何種標準。如為約略值 分層訊息指南,請按照圖 2 的指示操作。

安全性和隱私權

請勿記錄個人識別資訊 (PII)。這個 包含詳細資料,例如:

  • 電子郵件地址
  • 電話號碼
  • 名稱

同樣地,即使 可明確識別個人身分

舉例來說,雖然時區資訊不屬於個人識別資訊 但能指出使用者的約略位置。

唯有基於安全考量,處理記錄政策和可接受的詳細資料 產品上市前,我們會進行隱私權審查

裝置記錄

存取所有裝置記錄,包括使用 android.permission.READ_LOGS敬上 受到限制:

  • 如果背景的應用程式要求存取所有裝置記錄,系統會自動提出要求 拒絕,除非以下應用程式:
    • 共用系統 UID。
    • 使用原生系統程序 (UID < APP_UID)。
    • 使用 DropBoxManager
    • 僅存取事件記錄緩衝區。
    • 使用 EventLog API。
    • 使用檢測設備測試。
  • 如果前景中具有「READ_LOGS」的應用程式要求存取裝置記錄, 系統會提示使用者核准或拒絕存取權要求。

,瞭解如何調查及移除這項存取權。