Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Hiểu về ghi nhật ký

Bài viết này đề cập đến quá trình ghi nhật ký, bao gồm tiêu chuẩn nhật ký, hướng dẫn cấp độ, lớp, mục đích và xấp xỉ nhiều ngăn xếp.

Đăng nhập tiêu chuẩn

Đăng nhập Android rất phức tạp do sử dụng hỗn hợp các tiêu chuẩn được kết hợp trong logcat . Các tiêu chuẩn chính được sử dụng được trình bày chi tiết dưới đây:

Nguồn ví dụ Hướng dẫn mức ngăn xếp
RFC 5424 (tiêu chuẩn syslog ) Nhân Linux, nhiều ứng dụng Unix Kernel, daemon hệ thống
android.util.Log Ghi nhật ký ứng dụng + khung Android Android framework và ứng dụng hệ thống
java.util.logging.Level Ghi nhật ký chung trong Java ứng dụng phi hệ thống

Hình 1: Tiêu chuẩn cấp nhật ký.

Mặc dù mỗi tiêu chuẩn này có cấu trúc mức độ tương tự nhau, nhưng chúng khác nhau về mức độ chi tiết. Tương đương gần đúng giữa các tiêu chuẩn như sau:

Cấp độ RFC 5424 RFC 5424 Mức độ nghiêm trọng Mô tả RFC 5424 android.util.Log java.util.logging.Level
0 Trường hợp khẩn cấp Hệ thống không sử dụng được Log.e / Log.wtf SEVERE
1 Báo động Hành động phải được thực hiện ngay lập tức Log.e / Log.wtf SEVERE
2 Bạo kích điều kiện quan trọng Log.e / Log.wtf SEVERE
3 Lỗi điều kiện lỗi Log.e SEVERE
4 Cảnh báo điều kiện cảnh báo Log.w WARNING
5 Lưu ý Bình thường nhưng đáng kể Log.w WARNING
6 Thông tin nhắn tin thông tin Log.i INFO
7 gỡ lỗi Thông báo cấp gỡ lỗi Log.d CONFIG , FINE
- - nhắn tin chi tiết Log.v FINER / FINEST

Hình 2: Các mức ghi syslog , Android và Java.

Hướng dẫn cấp nhật ký

Hiện có các hướng dẫn được đưa ra cho từng tiêu chuẩn nhật ký. Cấp nhật ký đã chọn tuân theo tiêu chuẩn phù hợp đang được sử dụng, như sử dụng tiêu chuẩn syslog để phát triển nhân.

Thứ tự cấp nhật ký, từ thấp nhất đến cao nhất, được hiển thị trong ba hình bên dưới:

ERROR Những bản ghi này luôn được lưu giữ.
WARN Những bản ghi này luôn được lưu giữ.
INFO Những bản ghi này luôn được lưu giữ.
DEBUG Các nhật ký này được biên dịch nhưng bị loại bỏ khi chạy.
VERBOSE Các nhật ký này không bao giờ được biên dịch thành một ứng dụng ngoại trừ trong quá trình phát triển.

Hình 3: android.util.Log

CONFIG Mức thông báo cho thông báo cấu hình tĩnh
FINE Mức tin nhắn cung cấp thông tin truy vết
FINER Cho biết một thông báo truy tìm khá chi tiết
FINEST Cho biết thông báo theo dõi rất chi tiết
INFO Cấp độ tin nhắn cho tin nhắn thông tin
SEVERE Mức thông báo cho biết lỗi nghiêm trọng
WARNING Mức thông báo chỉ ra một vấn đề tiềm ẩn

Hình 4: java.util.Logging.Level .

0 Trường hợp khẩn cấp Hệ thống không sử dụng được
1 Báo động Hành động phải được thực hiện ngay lập tức
2 Bạo kích điều kiện quan trọng
3 Lỗi điều kiện lỗi
4 Cảnh báo điều kiện cảnh báo
5 Lưu ý Tình trạng bình thường nhưng đáng kể
6 thông tin tin nhắn thông tin
7 gỡ lỗi Thông báo cấp gỡ lỗi

Hình 5: RFC 5424 - Mục 6.2.1 .

Ghi nhật ký ứng dụng

Ghi nhật ký chọn lọc được thực hiện với TAG bởi lớp android.util.Log sử dụng Log#isLoggable , như minh họa bên dưới:

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

Nhật ký có thể được điều chỉnh trong thời gian chạy để cung cấp mức ghi nhật ký được chọn như hình bên dưới:

adb shell setprop log.tag.FOO_TAG VERBOSE

thuộc tính log.tag.* được đặt lại khi khởi động lại. Có những biến thể liên tục vẫn tồn tại trong quá trình khởi động lại. Xem bên dưới:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Kiểm tra Log#isLoggable để lại dấu vết nhật ký trong mã ứng dụng. Các cờ DEBUG Boolean bỏ qua các dấu vết nhật ký bằng cách sử dụng tối ưu hóa trình biên dịch được đặt thành false , như minh họa bên dưới:

private final static boolean DEBUG = false;

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

Việc ghi nhật ký có thể được xóa trên cơ sở mỗi APK thông qua bộ quy tắc ProGuard của R8 tại thời điểm biên dịch. Ví dụ sau xóa mọi thứ bên dưới ghi nhật ký mức INFO cho 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

Điều này hữu ích để xử lý nhiều loại bản dựng ứng dụng (ví dụ: bản dựng phát triển so với bản phát hành) trong đó mã cơ sở dự kiến ​​sẽ giống nhau nhưng mức nhật ký được phép thì khác nhau. Một chính sách rõ ràng phải được thiết lập và tuân theo đối với các ứng dụng (đặc biệt là các ứng dụng hệ thống) để quyết định cách các loại bản dựng và kỳ vọng phát hành tác động đến đầu ra nhật ký.

Ghi nhật ký hệ thống trong Thời gian chạy Android (ART)

Có một số lớp khả dụng dành cho các ứng dụng và dịch vụ hệ thống:

Lớp Mục đích
android.telephony.Rlog ghi nhật ký vô tuyến
android.util.Log Nhật ký ứng dụng chung
android.util.EventLog Ghi nhật ký sự kiện chẩn đoán của nhà tích hợp hệ thống
android.util.Slog Ghi nhật ký khung nền tảng

Hình 6: Các lớp và mục đích của nhật ký hệ thống khả dụng.

Mặc dù android.util.Logandroid.util.Slog sử dụng cùng tiêu chuẩn mức nhật ký, nhưng Slog là một lớp @hide chỉ nền tảng mới có thể sử dụng được. Các mức Nhật ký sự kiện được ánh xạ tới các mục trong event.logtags EventLog /system/etc/event-log-tags .

Ghi nhật ký gốc

Đăng nhập C/C++ tuân theo tiêu chuẩn syslog hệ thống với syslog (2) tương ứng với syslog của nhân Linux điều khiển bộ đệm printksyslog (3) tương ứng với nhật ký hệ thống chung. Android sử dụng thư viện liblog để ghi nhật ký hệ thống chung.

liblog cung cấp trình bao bọc cho các nhóm nhật ký con bằng cách sử dụng biểu mẫu macro sau:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD , ví dụ, tương ứng với [Radio log buffer ID] LOG [Debug Level] . Các trình bao bọc liblog chính như sau:

lớp bao bọc hàm ví dụ
log_main.h ALOGV , ALOGW
log_radio.h RLOGD , RLOGE
log_system.h SLOGI , SLOGW

Hình 7: trình bao bọc liblog .

Android có các giao diện cấp cao hơn để ghi nhật ký được ưa chuộng hơn so với việc sử dụng liblog trực tiếp, như được thấy bên dưới:

Thư viện Cách sử dụng
async_safe Thư viện chỉ dành cho ghi nhật ký từ môi trường không đồng bộ-tín hiệu-an toàn
libbase Thư viện ghi nhật ký cung cấp giao diện luồng C++ để ghi nhật ký, tương tự như ghi nhật ký kiểu Google (glog). libbase có thể sử dụng được trong cả các dự án bên ngoài và có sẵn trong các ứng dụng sử dụng libbase_ndk .

Hình 8: Thư viện nhật ký cấp cao hơn.

Xấp xỉ nhiều ngăn xếp

Do sự khác biệt về mức độ chi tiết và ý định cấp độ, không có kết hợp rõ ràng hoặc chính xác của các tiêu chuẩn ghi nhật ký khác nhau. Ví dụ: các mức java.util.logging.Levelandroid.util.Log cho nhật ký lỗi không khớp 1:1:

java.util.Logging.Level android.util.Log
DỮ DỘI Log.wtf
DỮ DỘI Log.e

Hình 9: Mức độ lỗi trong ghi nhật ký Java tiêu chuẩn so với ghi nhật ký Android.

Trong những trường hợp như thế này, hãy sử dụng tiêu chuẩn cá nhân để xác định cấp độ nào sẽ áp dụng.

Trong quá trình phát triển hệ thống với nhiều thành phần cấp độ ngăn xếp, hãy làm theo Hình 1 để xác định tiêu chuẩn nào sẽ sử dụng cho mỗi thành phần. Để có hướng dẫn gần đúng về thông báo cấp, hãy làm theo Hình 2.

An ninh và sự riêng tư

Không đăng nhập Thông tin nhận dạng cá nhân (PII). Điều này bao gồm các chi tiết như:

  • địa chỉ email
  • Số điện thoại
  • tên

Tương tự, một số chi tiết được coi là nhạy cảm ngay cả khi không thể nhận dạng cá nhân một cách rõ ràng.

Ví dụ: mặc dù thông tin múi giờ không được coi là có thể nhận dạng cá nhân, nhưng thông tin này cung cấp dấu hiệu về vị trí gần đúng của người dùng.

Chính sách nhật ký và các chi tiết có thể chấp nhận phải được xử lý như một phần của quá trình xem xét bảo mật và quyền riêng tư trước khi phát hành.

Nhật ký thiết bị

Quyền truy cập vào tất cả nhật ký thiết bị, kể cả việc sử dụng android.permission.READ_LOGS bị hạn chế:

  • Nếu một ứng dụng trong nền yêu cầu quyền truy cập vào tất cả nhật ký thiết bị, thì yêu cầu đó sẽ tự động bị từ chối trừ khi ứng dụng:
    • chia sẻ UID hệ thống.
    • sử dụng quy trình hệ thống riêng ( UID < APP_UID ).
    • sử dụng DropBoxManager .
    • chỉ truy cập bộ đệm nhật ký sự kiện.
    • sử dụng EventLog ký sự kiện.
    • sử dụng các bài kiểm tra thiết bị.
  • Nếu một ứng dụng ở nền trước có READ_LOGS yêu cầu quyền truy cập vào nhật ký thiết bị, hệ thống sẽ nhắc người dùng phê duyệt hoặc từ chối yêu cầu truy cập.