Trang chủ › Blog

Các mức độ log trong Android: Verbose, Debug, Info, Warn, Error và Assert

Đăng ngày 07/10/2026 · 9 phút đọc · Team Gofable

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ứcHàmKý hiệuDùng cho
VerboseLog.v()VChi tiết cực nhỏ, chỉ bật khi điều tra sâu một vấn đề.
DebugLog.d()DThông tin hữu ích trong quá trình phát triển.
InfoLog.i()ICác mốc quan trọng trong luồng hoạt động bình thường.
WarnLog.w()WĐiều bất thường nhưng ứng dụng vẫn tự xử lý được.
ErrorLog.e()ELỗi làm một chức năng không hoàn thành được.
AssertLog.wtf()ATì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

  1. Người dùng có bị ảnh hưởng không? Có và chức năng thất bại → Error.
  2. Ứng dụng có phải đi đường vòng để tự cứu không? Có → Warn.
  3. Đây có phải mốc mà người hỗ trợ kỹ thuật cần biết không? Có → Info.
  4. Chỉ lập trình viên đang sửa code này mới cần? → Debug.
  5. Chi tiết đến mức chỉ bật khi điều tra sâu? → Verbose.

Đặt tag sao cho dễ lọc

Đừ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.