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; |
---|
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.Log
và android.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 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] |
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.Level
và android.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.