Quản lý Log Docker: Đừng để ổ cứng “đột tử” vì file log hàng chục GB

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Chuyện thật: Khi 50GB log “nhấn chìm” server trong một đêm

Làm việc với Docker mà quên quản lý log thì sớm muộn bạn cũng sẽ nếm mùi server “ngỏm” giữa đêm. Mình từng quản lý một con VPS chạy Node.js với ổ cứng 80GB. Một sáng thức dậy, toàn bộ dịch vụ sập sạch vì báo lỗi 100% dung lượng đĩa cứng. Sau khi quét du -sh, mình tá hỏa thấy file log của một container duy nhất đã phình lên tới 50GB chỉ sau 3 tháng vận hành.

Kịch bản khác cũng gây ức chế không kém: App báo lỗi 500, bạn gõ docker logs container_name và ngồi chờ. Năm phút trôi qua, màn hình vẫn trắng xóa. Docker đang phải gồng mình load hàng triệu dòng log cũ để đẩy ra terminal. Lúc này, xem log không còn là debug nữa, nó trở thành một bài kiểm tra sự kiên nhẫn.

Tại sao log Docker lại dễ gây rắc rối?

Mặc định, Docker sử dụng json-file làm logging driver. Cơ chế này sẽ tóm lấy mọi dữ liệu từ stdoutstderr của ứng dụng. Sau đó, Docker bọc chúng vào định dạng JSON rồi ghi thẳng xuống file text trên máy host.

Rắc rối thường đến từ hai lỗ hổng lớn trong cấu hình:

  • Thiếu cơ chế xoay vòng (Log Rotation): File log không có giới hạn, nó cứ lớn dần cho đến khi chiếm trọn ổ cứng.
  • Log quá nhiễu: App in ra quá nhiều dòng debug vô nghĩa ở môi trường Production. Việc tìm một dòng báo lỗi thực sự lúc này chẳng khác nào mò kim đáy bể.

Kỹ thuật xem và quản lý log từ cơ bản đến nâng cao

1. Khai thác sức mạnh của lệnh docker logs

Đừng chỉ gõ mỗi docker logs [ID] nếu không muốn treo terminal. Hãy sử dụng các tham số thông minh hơn để lọc dữ liệu:

# Chỉ xem 100 dòng cuối và theo dõi trực tiếp
docker logs -f --tail 100 <container_id>

# Lọc log trong một khoảng thời gian cụ thể (ví dụ: 1 tiếng vừa qua)
docker logs --since 60m <container_id>

# Hiển thị timestamp để đối chiếu thời gian lỗi chính xác
docker logs -t --since "2023-10-27T10:00:00" <container_id>

Khi gặp các log API trả về JSON dài dằng dặc, mình thường copy nhanh vào JSON Formatter tại toolcraft.app. Cách này giúp cấu trúc lại dữ liệu để đọc lỗi nhanh hơn là cố căng mắt nhìn đống text lộn xộn trong console.

2. Cấu hình Log Rotation – “Phao cứu sinh” cho ổ cứng

Đây là bước bắt buộc cho mọi dự án Production. Thay vì đợi ổ cứng đầy mới đi xóa, bạn hãy giới hạn dung lượng log ngay trong docker-compose.yml:

services:
  app:
    image: my-awesome-app:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m" # Mỗi file tối đa 10MB
        max-file: "3"   # Chỉ giữ lại 3 file gần nhất

Cấu hình trên đảm bảo log của một service không bao giờ vượt quá 30MB. Nếu muốn áp dụng cho toàn bộ container trên server, bạn hãy sửa file /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Đừng quên chạy sudo systemctl restart docker để kích hoạt thay đổi nhé.

3. Truy cập trực tiếp file log trên Host

Nếu Docker CLI bị treo do log quá nặng, bạn có thể can thiệp trực tiếp vào file gốc trên Linux. Đường dẫn thường nằm tại:

/var/lib/docker/containers/<container_id>/<container_id>-json.log

Sử dụng kết hợp grep hoặc tail -n 1000 trực tiếp lên file này sẽ nhanh hơn rất nhiều so với dùng lệnh Docker thông thường.

Giải pháp chuyên nghiệp: Logging tập trung

Khi hệ thống vượt quá 10 container, việc SSH vào từng con để gõ lệnh là điều bất khả thi. Bạn cần một quy trình chuyên nghiệp hơn:

  1. Dùng Structured Logging: Hãy yêu cầu Team Dev in log dưới dạng JSON thay vì text thuần. Điều này giúp các công cụ phân tích dễ dàng bóc tách các trường dữ liệu như user_id hay error_code.
  2. Triển khai Loki & Grafana: Đây là bộ đôi cực nhẹ, thay thế hoàn hảo cho ELK Stack nặng nề. Loki giúp gom log từ nhiều server về một nơi để bạn tìm kiếm tập trung.
  3. ELK Stack (Elasticsearch – Logstash – Kibana): Phù hợp cho các hệ thống lớn cần phân tích dữ liệu log chuyên sâu và vẽ biểu đồ phức tạp.

Với các dự án nhỏ trên VPS, cấu hình Log Rotation là đủ để bạn ngủ ngon. Đừng phức tạp hóa công nghệ khi quy mô chưa thực sự cần tới. Hãy nhớ: log là tài sản để debug, nhưng nếu không quản trị tốt, nó sẽ trở thành gánh nặng hạ tầng.

Share: