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; |
---|
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.Log
và android.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 printk
và syslog
(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.Level
và android.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.