Các mức độ log trong Android: Verbose, Debug, Info, Warn, Error và Assert
Chọn sai mức độ log là nguyên nhân phổ biến khiến log vừa nhiều vừa khó đọc. Bài viết này giải thích từng mức độ, đưa ra quy tắc chọn mức cụ thể và chỉ cách giữ cho bản phát hành không bị “rò” log debug.
Sáu mức độ log
Lớp android.util.Log cung cấp sáu mức, sắp xếp từ chi tiết nhất đến nghiêm trọng nhất:
| Mức | Hàm | Ký hiệu | Dùng cho |
|---|---|---|---|
| Verbose | Log.v() | V | Chi tiết cực nhỏ, chỉ bật khi điều tra sâu một vấn đề. |
| Debug | Log.d() | D | Thông tin hữu ích trong quá trình phát triển. |
| Info | Log.i() | I | Các mốc quan trọng trong luồng hoạt động bình thường. |
| Warn | Log.w() | W | Điều bất thường nhưng ứng dụng vẫn tự xử lý được. |
| Error | Log.e() | E | Lỗi làm một chức năng không hoàn thành được. |
| Assert | Log.wtf() | A | Tình huống “không bao giờ được xảy ra”. |
Khi bạn lọc theo một mức, Logcat hiển thị mức đó và mọi mức nghiêm trọng hơn. Ví dụ, lọc ở mức Warn sẽ hiện cả W, E và A.
Khi nào dùng mức nào?
Verbose – “mọi thứ tôi có thể muốn biết”
Nội dung từng gói tin mạng, giá trị biến trong vòng lặp, từng khung hình được vẽ. Verbose sinh rất nhiều log, nên chỉ dùng tạm thời hoặc đặt sau một cờ cấu hình. Đừng để Verbose bật mặc định, nó sẽ nhấn chìm mọi log khác.
Debug – “điều lập trình viên cần khi phát triển”
Kết quả trả về của API, trạng thái của ViewModel, quyết định rẽ nhánh trong logic. Debug là mức dùng nhiều nhất khi phát triển và thường bị loại khỏi bản phát hành.
Info – “câu chuyện của ứng dụng”
Người dùng đăng nhập thành công, đồng bộ dữ liệu hoàn tất, ứng dụng chuyển sang chế độ ngoại tuyến. Nếu chỉ đọc các dòng Info, người khác phải hiểu được ứng dụng đã đi qua những bước nào.
Warn – “có gì đó không ổn, nhưng đã xử lý”
Một yêu cầu mạng phải thử lại, bộ nhớ đệm hỏng nên phải tải lại, dữ liệu trả về thiếu trường không bắt buộc. Warn là tín hiệu sớm: một lỗi Error hôm nay thường đã có nhiều Warn từ trước.
Error – “chức năng đã thất bại”
Thanh toán không thành công, không lưu được tệp, phản hồi máy chủ không phân tích được. Luôn kèm đối tượng ngoại lệ để có stack trace:
Log.e(TAG, "Không lưu được ảnh đại diện userId=$userId", exception)
Assert (wtf) – “điều không thể đã xảy ra”
Log.wtf() (viết tắt của “What a Terrible Failure”) dành cho trạng thái mà theo logic là không thể xảy ra, ví dụ một nhánh when lẽ ra không bao giờ chạy tới. Tùy cấu hình hệ thống, lời gọi này có thể ghi thêm thông tin chẩn đoán hoặc thậm chí kết thúc tiến trình, vì vậy hãy dùng thật tiết kiệm.
Quy tắc chọn mức nhanh
- Người dùng có bị ảnh hưởng không? Có và chức năng thất bại → Error.
- Ứng dụng có phải đi đường vòng để tự cứu không? Có → Warn.
- Đây có phải mốc mà người hỗ trợ kỹ thuật cần biết không? Có → Info.
- Chỉ lập trình viên đang sửa code này mới cần? → Debug.
- Chi tiết đến mức chỉ bật khi điều tra sâu? → Verbose.
Đặt tag sao cho dễ lọc
- Dùng hằng số trong mỗi lớp:
private const val TAG = "CheckoutRepo". - Đặt theo chức năng hoặc thành phần, không theo tên người viết.
Sync,Auth,Playerdễ lọc hơn nhiều so vớiTEST_NAM. - Giữ tag ngắn. Trên Android 7.1 (API 25) trở xuống, tag dài hơn 23 ký tự khiến
Log.isLoggable()ném ngoại lệ. - Có thể thêm tiền tố chung cho cả ứng dụng, ví dụ
Gf.Auth,Gf.Sync, để lọc toàn bộ log của mình chỉ bằng một từ khóa.
Đừng để log debug lọt vào bản phát hành
Log Debug và Verbose làm chậm ứng dụng, tốn bộ nhớ đệm và có thể vô tình để lộ thông tin nội bộ. Có hai cách phổ biến để loại bỏ chúng.
Cách 1: Kiểm tra cờ BuildConfig
object AppLog {
fun d(tag: String, message: () -> String) {
if (BuildConfig.DEBUG) Log.d(tag, message())
}
}
Truyền thông điệp dưới dạng lambda giúp tránh tốn công nối chuỗi khi log bị tắt.
Cách 2: Để R8 loại bỏ lời gọi log
Thêm quy tắc sau vào tệp proguard-rules.pro, R8 sẽ xóa các lời gọi Log.v và Log.d khỏi bản build đã tối ưu:
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int d(...);
}
Quy tắc này chỉ có tác dụng khi bản build bật minify. Hãy kiểm tra lại bằng cách cài bản release và xem Logcat.
Mức độ log trong HVTD-9803 LogCat
Trên trang công cụ của HVTD-9803 LogCat, bạn có thể lọc nhanh theo Info, Debug và Error. Dòng Error được tô nền đỏ nhạt để nổi bật giữa hàng trăm dòng khác. Khi chọn mức log hợp lý ngay từ lúc viết code, việc theo dõi log từ xa sẽ dễ dàng hơn nhiều.
Tóm tắt
Mức độ log là cách bạn nói với người đọc log sau này rằng “điều này quan trọng đến đâu”. Dùng Info để kể câu chuyện, Warn để cảnh báo sớm, Error cho thất bại thật sự, giữ Debug và Verbose cho lúc phát triển, và loại chúng khỏi bản phát hành.