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 các tiêu chuẩn nhật ký, nguyên tắc cấp độ, lớp, mục đích và xấp xỉ nhiều lớp.

Tiêu chuẩn nhật ký

Việc đăng nhập vào Android rất phức tạp do sự kết hợp của các tiêu chuẩn được sử dụng đượ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 cấp ngăn xếp
RFC 5424 (tiêu chuẩn syslog thống) Nhân Linux, nhiều ứng dụng Unix Hạt nhân, trình nền hệ thống
android.util.Log Khung Android + ghi nhật ký ứng dụng Ứng dụng hệ thống và khung Android
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ó mức độ xây dựng tương tự nhau nhưng chúng khác nhau về mức độ chi tiết. Tương đương gần đúng trên các tiêu chuẩn như sau:

Cấp độ RFC 5424 Mức độ nghiêm trọng RFC 5424 Mô tả RFC 5424 android.util.Log java.util.logging.Level
0 Khẩn cấp Hệ thống không thể sử dụng được Log.e / Log.wtf SEVERE
1 Báo động Phải hành động ngay lập tức Log.e / Log.wtf SEVERE
2 Phê bình Đ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 Để ý Bình thường nhưng có ý nghĩa Log.w WARNING
6 Thông tin Tin nhắn thông tin Log.i INFO
7 Gỡ lỗi Thông báo cấp độ gỡ lỗi Log.d CONFIG , FINE
- - Tin nhắn dài dòng Log.v FINER / FINEST

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

Nguyên tắc cấp nhật ký

Có những hướng dẫn hiện có được đưa ra cho từng tiêu chuẩn nhật ký. Mức nhật ký được chọn tuân theo tiêu chuẩn thích hợp đang được sử dụng, chẳng hạn như sử dụng tiêu chuẩn syslog để phát triển hạt nhân.

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

ERROR Những nhật ký này luôn được lưu giữ.
WARN Những nhật ký này luôn được lưu giữ.
INFO Những nhật ký 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 Những nhật ký này không bao giờ được biên dịch thành ứ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 Cấp độ tin nhắn cung cấp thông tin theo dõi
FINER Cho biết một thông báo theo dõi khá chi tiết
FINEST Cho biết mộ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 thấy lỗi nghiêm trọng
WARNING Mức độ thông báo cho thấy một vấn đề tiềm ẩn

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

0 Khẩn cấp Hệ thống không thể sử dụng được
1 Báo động Phải hành động ngay lập tức
2 Phê bình Đ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 Để ý Tình trạng bình thường nhưng có ý nghĩa
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

Việc ghi nhật ký có chọn lọc được thực hiện bằng TAG bởi lớp android.util.Log bằng cách sử dụng Log#isLoggable , như hiển thị 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ư dưới đây:

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ũng có những biến thể dai dẳng vẫn tồn tại trong các lần 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ờ DEBUG Boolean bỏ qua 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ư hiển thị bên dưới:

private final static boolean DEBUG = false;

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

Có thể xóa ghi nhật ký 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 sẽ xóa mọi thứ dưới mức ghi nhật ký 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 dựng phát hành) trong đó mã cơ bản dự kiến ​​giống nhau nhưng cấp độ nhật ký được phép sẽ khác nhau. Một chính sách rõ ràng phải được đặt và tuân theo cho các ứng dụng (đặc biệt là các ứng dụng hệ thống) để quyết định mức độ tác động của loại bản dựng và kỳ vọng phát hành đến đầu ra nhật ký.

Ghi nhật ký hệ thống trong Android Runtime (ART)

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

Lớp học Mục đích
android.telephony.Rlog Ghi nhật ký vô tuyến
android.util.Log Ghi nhật ký ứng dụng chung
android.util.EventLog Ghi nhật ký sự kiện chẩn đoán 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 có sẵn.

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

Ghi nhật ký gốc

Việc đăng nhập C/C++ tuân theo tiêu chuẩn syslog hệ thống với syslog thống (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]

Ví dụ: RLOGD 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ỉ để ghi nhật ký từ môi trường an toàn tín hiệu không đồng bộ
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 lớp

Do sự khác biệt về mức độ chi tiết và mục đích cấp độ, nên không có sự trùng khớp rõ ràng hoặc chính xác nào giữa các tiêu chuẩn ghi nhật ký khác nhau. Ví dụ: cấp độ 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
NGHIÊM TRỌNG Log.wtf
NGHIÊM TRỌNG Log.e

Hình 9: Mức độ lỗi khi 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 riêng để xác định mức độ nào cần á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. Để biết 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 nhất định đượ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 nó đưa ra 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 chấp nhận phải được xử lý như một phần của quá trình đánh giá 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ị, bao gồm cả việc sử dụng android.permission.READ_LOGS bị hạn chế:

  • Nếu một ứng dụng ở chế độ 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 gốc ( UID < APP_UID ).
    • sử dụng DropBoxManager .
    • chỉ truy cập vào bộ đệm nhật ký sự kiện.
    • sử dụng API EventLog .
    • sử dụng các bài kiểm tra dụng cụ.
  • 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ị thì 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.