Cách xây dựng hệ thống logging tập trung cho microservices
Hệ thống logging tập trung gom log từ mọi service, container và máy chủ về một nơi để tìm kiếm, lọc và cảnh báo. Với microservices, đây gần như là điều bắt buộc: một request của người dùng có thể đi qua năm sáu service, và nếu log nằm rải rác trên từng container (vốn có thể biến mất khi restart), việc điều tra sự cố trở thành đoán mò. Một hệ thống tốt gồm bốn phần: log có cấu trúc với mã định danh request, agent thu thập, kho lưu trữ có chỉ mục và giao diện truy vấn kèm cảnh báo.
Những gì cần đạt được
Trước khi chọn công cụ, xác định yêu cầu:
- Tìm toàn bộ log của một request qua mọi service chỉ bằng một mã.
- Lọc theo service, môi trường, mức độ, khoảng thời gian, người dùng.
- Thời gian từ lúc ghi log đến lúc tìm thấy được ngắn (vài giây đến vài chục giây).
- Lưu đủ lâu cho điều tra và yêu cầu kiểm toán, nhưng chi phí kiểm soát được.
- Không làm lộ dữ liệu nhạy cảm như mật khẩu, token, số thẻ.
Viết log đúng cách ngay từ ứng dụng
Log có cấu trúc
Thay vì dòng văn bản tự do, ghi log dạng JSON với các trường cố định: thời gian (ISO 8601, UTC), mức độ, tên service, phiên bản, môi trường, thông điệp, cùng các trường ngữ cảnh như mã đơn hàng, mã người dùng. Log có cấu trúc cho phép lọc chính xác "mọi lỗi của service thanh toán với mã đối tác X" mà không phải viết biểu thức chính quy.
Correlation ID và trace ID
Mỗi request khi vào hệ thống (tại API gateway) được gán một mã duy nhất, truyền qua header cho mọi service phía sau và qua metadata của tin nhắn trong hàng đợi. Mọi dòng log đều kèm mã này. Chuẩn W3C Trace Context (header traceparent) và OpenTelemetry giúp làm việc này thống nhất giữa các ngôn ngữ, đồng thời liên kết log với trace.
Chọn mức độ log hợp lý
| Mức | Dùng khi |
|---|---|
| ERROR | Thao tác thất bại cần người xem xét: không ghi được đơn, gọi đối tác lỗi sau khi đã retry |
| WARN | Bất thường nhưng hệ thống tự xử lý được: retry, dùng giá trị dự phòng |
| INFO | Sự kiện nghiệp vụ quan trọng: đơn tạo, thanh toán thành công, service khởi động |
| DEBUG | Chi tiết để gỡ lỗi; tắt ở production hoặc chỉ bật tạm thời |
Lỗi phổ biến là log ERROR cho những việc bình thường (người dùng nhập sai mật khẩu), khiến cảnh báo bị nhiễu và đội dần bỏ qua.
Không log dữ liệu nhạy cảm
Che hoặc loại bỏ mật khẩu, token, số thẻ, số CMND/CCCD trước khi ghi. Tốt nhất là xử lý ở thư viện logging dùng chung với danh sách trường bị che, và thêm một lớp lọc tại agent thu thập để dự phòng.
Kiến trúc thu thập và lưu trữ
Luồng điển hình:
- Ứng dụng ghi log ra stdout/stderr (chuẩn với container), không tự gửi qua mạng.
- Agent chạy trên mỗi node (Fluent Bit, Vector, Filebeat, OpenTelemetry Collector) đọc log, gắn metadata (tên pod, namespace, node), lọc, che dữ liệu nhạy cảm.
- Bộ đệm (tùy chọn) như Kafka giữ log khi kho lưu trữ chậm hoặc bảo trì, tránh mất log lúc cao điểm. Bài so sánh RabbitMQ, Kafka và Redis Pub/Sub giải thích vì sao Kafka hợp cho vai trò này.
- Kho lưu trữ có chỉ mục phục vụ truy vấn.
- Giao diện để tìm kiếm, dashboard và cảnh báo.
Chọn kho lưu trữ log
| Lựa chọn | Điểm mạnh | Lưu ý |
|---|---|---|
| Elasticsearch / OpenSearch + Kibana/Dashboards | Tìm kiếm toàn văn mạnh, truy vấn linh hoạt | Tốn tài nguyên do đánh chỉ mục mọi trường; vận hành cụm phức tạp |
| Grafana Loki | Chỉ đánh chỉ mục nhãn, lưu nội dung nén trên object storage nên rẻ | Tìm kiếm toàn văn chậm hơn; cần thiết kế nhãn cẩn thận |
| Kho cột như ClickHouse | Nén tốt, truy vấn phân tích nhanh trên lượng log lớn | Cần tự xây hoặc dùng công cụ giao diện đi kèm |
| Dịch vụ cloud được quản lý | Không phải vận hành, tích hợp sẵn | Chi phí theo dung lượng nạp có thể tăng nhanh |
Với Loki, tránh dùng giá trị có số lượng lớn (mã người dùng, mã request) làm nhãn vì sẽ làm bùng nổ số luồng dữ liệu; để chúng trong nội dung log và lọc lúc truy vấn.
Kiểm soát chi phí
Log có xu hướng tăng nhanh hơn lưu lượng nghiệp vụ. Một vài biện pháp:
- Chia tầng lưu trữ: 7 đến 30 ngày ở kho nóng để truy vấn nhanh, lâu hơn chuyển sang object storage rẻ, chỉ khôi phục khi cần.
- Lấy mẫu log mức INFO cho các endpoint lưu lượng cực lớn như health check, giữ nguyên 100% log lỗi.
- Loại bỏ log trùng lặp, stack trace lặp lại hàng nghìn lần trong một phút.
- Theo dõi dung lượng log theo service, cảnh báo khi một service đột nhiên ghi gấp nhiều lần bình thường (thường là dấu hiệu lỗi).
Từ log đến cảnh báo và bảo mật
Log là một trong ba trụ cột của khả năng quan sát (observability) cùng metrics và traces. Không nên cảnh báo dựa trên từng dòng log lỗi, vì sẽ bị nhiễu; thay vào đó đếm tỷ lệ lỗi trong khoảng thời gian và kết hợp với chỉ số như mô tả trong bài xây dựng hệ thống monitoring cho production.
Log cũng là nguồn dữ liệu bảo mật quan trọng: đăng nhập thất bại liên tục, truy cập từ địa chỉ lạ, thay đổi quyền quản trị. Những cuộc dò mật khẩu hàng loạt vào dịch vụ đăng nhập từ xa, như trường hợp được phân tích trong bài về tấn công dò mật khẩu RDP vào doanh nghiệp, thường lộ ra rất sớm nếu log xác thực được gom về và có quy tắc cảnh báo.
Với log phục vụ kiểm toán (ai sửa dữ liệu gì, khi nào), cần lưu tách riêng, hạn chế quyền xóa và có thời gian lưu theo yêu cầu nội bộ hoặc pháp lý.
Checklist triển khai
- Thống nhất định dạng log JSON và thư viện logging dùng chung cho mọi service.
- Thêm correlation ID tại gateway và truyền qua mọi lời gọi, tin nhắn.
- Triển khai agent thu thập trên mọi node, có lọc dữ liệu nhạy cảm.
- Chọn kho lưu trữ theo quy mô và ngân sách, đặt chính sách lưu giữ.
- Tạo dashboard theo service và các truy vấn mẫu cho sự cố thường gặp.
- Diễn tập: chọn một lỗi giả định và thử tìm nguyên nhân chỉ bằng log.
Câu hỏi thường gặp
ELK và Loki nên chọn cái nào?
Chọn ELK hoặc OpenSearch khi cần tìm kiếm toàn văn mạnh và phân tích phức tạp trên log. Chọn Loki khi ưu tiên chi phí thấp, đã dùng Grafana và chủ yếu lọc theo service, môi trường rồi tìm chuỗi trong phạm vi hẹp.
Có nên ghi log vào file trong container không?
Không nên. Với container, chuẩn là ghi ra stdout/stderr để runtime và agent thu thập. Ghi file trong container dễ mất khi container bị thay thế và có thể làm đầy đĩa.
Lưu log bao lâu là đủ?
Tùy mục đích. Log vận hành thường giữ vài tuần ở kho truy vấn nhanh; log bảo mật và kiểm toán giữ lâu hơn theo chính sách nội bộ và quy định ngành. Nên ghi rõ thời hạn cho từng loại log.
OpenTelemetry có thay thế được thư viện logging không?
OpenTelemetry cung cấp chuẩn và SDK để thu thập log, metrics, traces thống nhất, thường hoạt động cùng thư viện logging sẵn có qua bridge. Nó giúp gắn trace ID vào log tự động và gửi dữ liệu tới nhiều backend khác nhau.
Bài liên quan
Hướng dẫn viết Unit Test và Integration Test đảm bảo chất lượng code
Cách viết unit test và integration test có giá trị: chọn phạm vi, đặt tên, dùng mock đúng chỗ, dựng database thử, đưa test vào CI và tránh test giòn.

So sánh Agile, Scrum và Kanban: chọn cách làm nào cho đội phần mềm
Agile là triết lý, Scrum và Kanban là hai cách thực hành. Bài so sánh vai trò, nhịp làm việc, chỉ số đo lường và gợi ý chọn mô hình theo loại dự án.

So sánh message queue: RabbitMQ, Kafka và Redis Pub/Sub
RabbitMQ, Kafka hay Redis Pub/Sub? So sánh mô hình lưu trữ, đảm bảo giao nhận, thứ tự tin nhắn, vận hành và tình huống nên dùng từng giải pháp.
So sánh nền tảng CMS WordPress, Strapi, Directus cho doanh nghiệp
WordPress, Strapi hay Directus? So sánh kiến trúc, đối tượng biên tập, khả năng mở rộng, bảo mật, chi phí vận hành để doanh nghiệp chọn CMS phù hợp.