Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Khi ứng dụng chạy thật và người dùng báo lỗi, bạn không thể gắn debugger vào. Thứ duy nhất bạn có là log. Log tốt giúp bạn xác định sự cố trong vài phút, log tệ thì hoặc không có gì để đọc, hoặc ngập trong hàng triệu dòng vô nghĩa. Dưới đây là những nguyên tắc ghi log hiệu quả.
Hầu hết thư viện đều có các mức từ nhẹ đến nặng. Dùng đúng mức giúp lọc nhanh khi cần.
| Mức | Dùng khi | Ví dụ |
|---|---|---|
| DEBUG | Chi tiết phục vụ lập trình viên | Giá trị biến, truy vấn đã chạy |
| INFO | Sự kiện bình thường quan trọng | Người dùng đăng nhập, job bắt đầu |
| WARN | Bất thường nhưng chưa hỏng | Dùng cấu hình mặc định vì thiếu giá trị |
| ERROR | Thao tác thất bại cần chú ý | Không lưu được đơn hàng |
| FATAL / CRITICAL | Hệ thống không thể tiếp tục | Mất kết nối database chính |
Trên môi trường production thường chỉ bật từ INFO trở lên; khi điều tra mới tạm bật DEBUG.
Đừng ghi log mọi dòng code, bạn sẽ chìm trong nhiễu. Hãy tự hỏi: "Lúc 3 giờ sáng có sự cố, thông tin nào giúp mình nhất?"
So sánh hai dòng log:
Kém: Payment failedTốt: Payment failed orderId=1042 userId=77 provider=momo error="timeout after 10s"Dòng thứ hai cho bạn biết đơn nào, người nào, nhà cung cấp nào, lỗi gì. Hãy luôn kèm: thời gian, mức log, mã yêu cầu (request id/correlation id), các định danh liên quan (user, order), và thông điệp rõ ràng.
Thay vì chuỗi văn bản tự do, nhiều hệ thống ghi log dạng JSON để máy dễ lọc và tìm:
{"time": "2025-03-14T09:21:07Z","level": "error","message": "payment failed","orderId": 1042,"userId": 77,"provider": "momo","requestId": "a1b2c3"}Với công cụ tập trung log, bạn có thể tìm "mọi dòng có orderId=1042" chỉ bằng một truy vấn. Trong JavaScript có thể dùng thư viện như Winston hoặc Pino, Python có module logging tích hợp, PHP có Monolog, Java có SLF4J với Logback.
Trong hệ thống có nhiều dịch vụ, một yêu cầu đi qua nhiều nơi. Hãy sinh một mã duy nhất ở điểm vào, truyền theo mọi lời gọi và ghi vào mọi dòng log. Khi có khiếu nại, bạn chỉ cần tìm mã đó để thấy toàn bộ hành trình.
a***@gmail.com).Log thường được nhiều người đọc và lưu lâu, nên rò rỉ qua log là lỗi bảo mật khá phổ biến.
Khi bắt exception, hãy ghi cả stack trace và ngữ cảnh, và chỉ ghi một lần. Nếu cùng một lỗi được log ở mỗi tầng khi nó đi lên, bạn sẽ có năm dòng cho một sự cố và khó đếm đúng số lần xảy ra.
try:charge(order)except PaymentError:logger.exception("Thanh toán thất bại order_id=%s", order.id)raiseHàm logger.exception trong Python tự đính kèm stack trace. Lưu ý dùng tham số của logger (dấu %s) thay vì tự nối chuỗi, để thư viện chỉ định dạng khi mức log thực sự được bật.
Trên Linux, các lệnh như tail -f app.log để theo dõi trực tiếp và grep "orderId=1042" app.log để lọc nhanh rất hữu ích.
Log tốt là log được thiết kế cho người sẽ đọc nó trong lúc sự cố: có mức hợp lý, ngữ cảnh đủ, cấu trúc rõ ràng và không lộ dữ liệu nhạy cảm. Hãy thử rà lại các thông điệp log trong dự án của bạn, xem chúng có trả lời được câu hỏi "chuyện gì đã xảy ra, với ai, ở đâu" hay chưa.
Nếu bạn muốn học cách triển khai và vận hành ứng dụng bài bản, hãy xem thêm trên codebem.com.
Nguyễn Đình Cường
0 comment