Logcat là công cụ Android SDK để xem thông báo hệ thống và log ứng dụng theo thời gian thực, có sẵn qua ADB hoặc bảng điều khiển tích hợp trong Android Studio. Theo Android Developers, Logcat thu thập thông báo từ tất cả các tiến trình hệ thống, lọc chúng theo mức độ quan trọng và thẻ, cho phép nhà phát triển chẩn đoán lỗi, theo dõi thực thi mã và phân tích hiệu suất. Logcat là nguồn thông tin chính khi gỡ lỗi ứng dụng Android.
Những điểm chính
Logcat là bộ đệm hệ thống Android nơi tất cả các tiến trình (bao gồm nhân Linux, system_server và ứng dụng) ghi thông báo theo định dạng cụ thể. Công cụ logcat, nằm trong Android SDK, đọc bộ đệm này và hiển thị thông báo theo thời gian thực. Bắt đầu từ Android 4.1 (API 16), quyền truy cập Logcat bị hạn chế: ứng dụng chỉ có thể đọc log của chính mình và log hệ thống có thể truy cập qua ADB với quyền gỡ lỗi.
Mỗi thông báo Logcat chứa năm trường: ngày và giờ, PID (định danh tiến trình), TID (định danh luồng), mức log và thẻ. Định dạng cố định và giống nhau trên tất cả các phiên bản Android. Điều này cho phép sử dụng các tiện ích grep, awk và sed để lọc log trong các pipeline CI/CD mà không phụ thuộc vào IDE.
Log được lưu trữ trong bộ đệm vòng có kích thước cố định: 256 KB cho main, 256 KB cho system và 256 KB cho events (Android 5+). Khi bộ đệm tràn, các thông báo cũ sẽ bị xóa. Nhà phát triển có thể thay đổi kích thước bộ đệm qua thuộc tính PROP logcat.size hoặc trong tùy chọn nhà phát triển của thiết bị.
Sáu mức ghi log xác định tầm quan trọng của thông báo. Android sử dụng các mức tiêu chuẩn tương tự như các nền tảng khác nhưng với tên hằng riêng trong lớp Log. Chọn đúng mức giúp lọc log hiệu quả và tránh làm chìm các thông báo quan trọng trong các thông báo thứ cấp.
| Mức | Hằng | Mục đích | Hiển thị mặc định |
|---|---|---|---|
| VERBOSE | Log.v | Thông tin gỡ lỗi chi tiết tối đa | Không |
| DEBUG | Log.d | Thông báo gỡ lỗi cho nhà phát triển | Không |
| INFO | Log.i | Thông báo thông tin về hoạt động của ứng dụng | Có |
| WARN | Log.w | Cảnh báo về các vấn đề tiềm ẩn | Có |
| ERROR | Log.e | Lỗi nghiêm trọng và ngoại lệ | Có |
| ASSERT | Log.wtf | Lỗi không bao giờ nên xảy ra về nguyên tắc | Có |
Thẻ (tag) — chuỗi tối đa 23 ký tự xác định nguồn của thông báo. Nên sử dụng tên lớp hoặc mô-đun làm thẻ: MainActivity, AuthManager, NetworkModule. Điều này cho phép lọc log theo một thành phần cụ thể của ứng dụng. Để đồng nhất trong nhóm, bạn có thể tạo hằng thẻ trong tệp riêng hoặc sử dụng thư viện Timber, tự động chèn thẻ dựa trên tên lớp.
Khi một ngoại lệ không được xử lý xảy ra, Android tự động ghi stack trace đầy đủ vào Logcat, chỉ ra lớp, phương thức, dòng mã và chuỗi gọi. Log sự cố chứa loại ngoại lệ (NullPointerException, RuntimeException), thông báo và chuỗi gọi từ điểm sự cố đến điểm vào của ứng dụng. Để phân tích log sự cố từ thiết bị người dùng, Firebase Crashlytics được sử dụng, đồng bộ hóa stack trace với bản đồ làm xáo trộn (mapping.txt cho Android).
Android Studio cung cấp giao diện đồ họa Logcat có thể truy cập qua View → Tool Windows → Logcat (Alt + 6). Cửa sổ Logcat cập nhật theo thời gian thực, hiển thị tất cả thông báo từ thiết bị đã kết nối và cho phép cấu hình các bộ lọc linh hoạt để cô lập thông tin mong muốn khỏi luồng chung.
Danh sách thả xuống Log Level lọc thông báo theo mức tối thiểu: chọn WARN để chỉ xem cảnh báo và lỗi, ẩn VERBOSE, DEBUG và INFO. Trường Tìm kiếm cho phép tìm theo nội dung thông báo hoặc thẻ — hỗ trợ regex, thuận tiện cho việc tìm thông báo theo mẫu.
Saved Filters — tính năng mạnh mẽ của Logcat trong Android Studio. Bạn có thể tạo bộ lọc chỉ hiển thị thông báo có thẻ ứng dụng của bạn (tag:MyApp) và mức WARN+. Bộ lọc được lưu giữa các phiên và có sẵn từ danh sách thả xuống. Đối với dự án có nhiều mô-đun, hãy tạo bộ lọc riêng cho từng mô-đun.
# Biểu thức ví dụ để lọc log ứng dụng
tag:"MyApp" level:WARN # Chỉ WARN+ cho MyApp
package:"com.mycompany" # Tất cả log của gói
-tag:"okhttp" # Loại trừ log OkHttp
Log Logcat có thể được xuất sang tệp văn bản qua biểu tượng Save to File. Điều này hữu ích để đính kèm vào ticket trong Jira hoặc phân tích các phiên dài. Log đã xuất có thể được mở trong bất kỳ trình soạn thảo văn bản nào và áp dụng grep để tìm kiếm mẫu. Để xem được định dạng, hãy sử dụng tiện ích logcat-color.
ADB logcat — phiên bản bảng điều khiển của Logcat, có thể truy cập qua Android Debug Bridge. Ưu điểm chính của nó là khả năng chạy trên máy chủ CI, trong tập lệnh tự động hóa và trên các thiết bị không có Android Studio. ADB logcat hỗ trợ tất cả các bộ lọc giống như GUI, nhưng với sự linh hoạt của dòng lệnh.
Lệnh adb logcat không có đối số xuất toàn bộ bộ đệm theo thời gian thực. Sử dụng Ctrl+C để dừng. Cờ -c xóa bộ đệm trước khi bắt đầu ghi — thuận tiện khi bạn cần cô lập log của bài kiểm tra hiện tại khỏi các thông báo trước đó. Cờ -b chọn loại bộ đệm: main, system, events, crash (Android 12+).
# Xóa bộ đệm và bắt đầu ghi log với thẻ MyApp
adb logcat -c
adb logcat MyApp:D *:S
# Lưu log vào tệp
adb logcat -d > logcat_dump.txt
# Lọc theo PID tiến trình
adb logcat --pid=12345
Kết hợp ADB với các tiện ích Unix mang lại sự linh hoạt tối đa. Ví dụ, bộ lọc "*:S TAG:D" chỉ hiển thị thông báo có thẻ TAG ở mức DEBUG trở lên, ẩn tất cả các thông báo khác. Để chỉ xem ngoại lệ, hãy sử dụng grep -i exception. Để phân tích tần suất lỗi, hãy áp dụng sort | uniq -c trên cột thẻ.
Trên máy chủ CI, Logcat được sử dụng để thu thập chẩn đoán trong quá trình chạy kiểm thử UI. Pipeline điển hình: xóa bộ đệm trước khi chạy kiểm thử, lưu kết xuất log như tạo phẩm xây dựng sau khi thực thi kiểm thử. Nếu kiểm thử thất bại, log có thể xác định liệu thất bại có phải do ANR, ngoại lệ không được xử lý hay hết thời gian chờ mạng.
Lớp android.util.Log — API tích hợp để ghi thông báo vào Logcat. Log.v, Log.d, Log.i, Log.w, Log.e và Log.wtf chấp nhận một thẻ (chuỗi) và một thông báo (chuỗi) hoặc thông báo + Throwable. Để định dạng thông báo, hãy sử dụng String.format hoặc mẫu chuỗi Kotlin — tránh nối chuỗi, tạo ra các đối tượng không cần thiết trong heap.
Timber — thư viện phổ biến của Jake Wharton, khắc phục những thiếu sót của API Log tích hợp. Timber tự động chèn thẻ dựa trên tên lớp đã gọi ghi log và không yêu cầu truyền thẻ trong mỗi lần gọi. Timber cũng hỗ trợ ghi log có điều kiện: trong bản dựng Release, các lệnh gọi Timber.v và Timber.d có thể bị vô hiệu hóa bằng một dòng trong Application.onCreate.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// API Log tích hợp
Log.d("MainActivity", "onCreate called")
// Timber — thẻ tự động theo tên lớp
Timber.d("onCreate called")
}
private fun loadData() {
try {
val result = fetchFromNetwork()
Timber.i("Data loaded: $result")
} catch (e: IOException) {
Timber.e(e, "Failed to load data")
}
}
}
Trong bản dựng Release, nên tắt log VERBOSE và DEBUG để giảm tải cho bộ đệm Logcat và ngăn rò rỉ thông tin nhạy cảm. Timber giải quyết vấn đề này thông qua PlantingTree: trong phiên bản Debug, DebugTree được trồng (ghi mọi thứ), trong Release — CrashReportingTree (chỉ ghi ERROR qua Crashlytics). API Log tích hợp không hỗ trợ ghi log có điều kiện — nhà phát triển cần bọc mỗi lệnh gọi bằng if (BuildConfig.DEBUG).
Câu hỏi thường gặp
Sử dụng lệnh adb logcat -c trước khi chạy kiểm thử. Thay vào đó, trong Android Studio nhấn nút Clear Logcat (thùng rác) trong cửa sổ Logcat. Xóa không ảnh hưởng đến bộ đệm hệ thống của các tiến trình khác, chỉ ảnh hưởng đến kết nối hiện tại.
Thực hiện adb logcat -G 2M để tăng bộ đệm lên 2 MB. Kích thước tối đa phụ thuộc vào thiết bị: trên Android 10+ có sẵn tới 16 MB. Thay đổi được giữ cho đến khi khởi động lại thiết bị. Để cấu hình vĩnh viễn, hãy sử dụng build.prop trong device tree.
Nguyên nhân có thể: ứng dụng đang chạy ở chế độ Release (log Timber.v/d bị tắt), bộ lọc Logcat ẩn mức cần thiết, hoặc bạn đã kết nối sai thiết bị. Cũng kiểm tra xem bạn đã chọn tiến trình của ứng dụng trong Android Studio chưa, không phải system_process.
Tìm dòng có FATAL EXCEPTION, bên dưới là stack trace đầy đủ. Dòng đầu tiên chứa loại ngoại lệ và thông báo, các dòng tiếp theo chứa chuỗi gọi với tệp và dòng mã. Sử dụng grep "FATAL EXCEPTION" để tìm nhanh trong tất cả các log.
ANR (Application Not Responding) — tình huống khi luồng chính (UI thread) bị chặn hơn 5 giây. Trong Logcat, ANR xuất hiện dưới dạng thông báo có thẻ ActivityManager và văn bản "ANR in ..." với stack trace đính kèm của tất cả các luồng. Sử dụng bộ lọc tag:ActivityManager level:ERROR.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm