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ý

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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ý, hướng dẫn cấp, lớp, mục đích và xấp xỉ nhiều ngăn xếp.

Tiêu chuẩn nhật ký

Đăng nhập trong 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 Các 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 Khung Android + ghi nhật ký ứng dụng Khung Android và ứng dụng hệ thống
java.util.logging.Level Đăng nhập chung trong Java ứng dụng phi hệ thống

Hình 1: Các 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 cấp độ tương tự nhau, nhưng chúng khác nhau về mức độ chi tiết. Sự tương đương gần đúng giữa các tiêu chuẩn như sau:

RFC 5424 cấp độ RFC 5424 Mức độ nghiêm trọng Mô tả RFC 5424 android.util.Log java.util.logging.Level
0 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 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 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 cấp độ ghi syslog , Android và Java.

Nguyên tắc về cấp độ nhật ký

Có các hướng dẫn hiện có được đưa ra cho mỗi tiêu chuẩn nhật ký. Mức nhật ký đã chọn tuân theo tiêu chuẩn thích hợp đang được sử dụng, giống 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 nhiều nhất, được hiển thị trong ba hình dưới đây:

ERROR Các bản ghi này luôn được lưu giữ.
WARN Các bản ghi này luôn được lưu giữ.
INFO Các bản ghi này luôn được lưu giữ.
DEBUG Các bản ghi này được biên dịch nhưng bị loại bỏ trong thời gian chạy.
VERBOSE Các bản ghi 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 các thông báo cấu hình tĩnh
FINE Mức thông báo cung cấp thông tin theo dõi
FINER Cho biết một thông báo truy tìm khá chi tiết
FINEST Cho biết một thông điệp theo dõi rất chi tiết
INFO Mức độ tin nhắn cho các tin nhắn thông tin
SEVERE Mức độ thông báo cho thấy một sự cố nghiêm trọng
WARNING Mức độ thông báo cho biết một vấn đề tiềm ẩn

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

0 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 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 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ý có 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ư hình dưới đây:

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 dưới đây:

adb shell setprop log.tag.FOO_TAG VERBOSE

Các 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 qua các lần khởi động lại. Xem bên dưới:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Log#isLoggable kiểm tra để lại dấu vết nhật ký trong mã ứng dụng. Boolean DEBUG cờ 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ư được 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 nhật ký trên cơ sở từng 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 loại bỏ mọi thứ bên dưới ghi nhật ký cấp 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 được mong đợi là giống nhau, nhưng các mức nhật ký được phép là khác nhau. Một chính sách rõ ràng phải được thiết lập 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 cách thức xây dựng các loại và giải phóng các kỳ vọng tác động đến kết quả ghi nhật ký.

Đăng nhập hệ thống trong Android Runtime (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 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 nhật ký hệ thống có sẵn.

Mặc dù android.util.Logandroid.util.Slog sử dụng các tiêu chuẩn cấp nhật ký giống nhau, nhưng Slog là một lớp @hide chỉ có thể sử dụng bởi nền tảng. Các cấp EventLog được ánh xạ tới các mục nhập trong tệp event.logtags trong /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 nhân Linux điều khiển bộ đệm printksyslog (3) tương ứng với bộ ghi 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 bọc Các chức năng 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ư bên dưới:

Thư viện Sử dụng
async_safe Thư viện chỉ để 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 dò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.

Ước lượng nhiều ngăn xếp

Do sự khác biệt về mức độ chi tiết và mục đích cấp, không có sự phù 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 cấp độ java.util.logging.Levelandroid.util.Log cho nhật ký lỗi không phải là một đối sánh 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 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 mức 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ề nhắn tin theo cấp, hãy làm theo Hình 2.

An ninh và sự riêng tư

Không ghi lại 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ó cho biết 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 xem xét bảo mật và quyền riêng tư trước khi phát hành.