Bạn nhận được cảnh báo VPS sắp hết dung lượng và phát hiện ra các file log đang chiếm hàng Gigabyte? Đây là tình huống mà bất kỳ quản trị viên hệ thống hay lập trình viên nào cũng phải đối mặt. Một file log không được kiểm soát có thể nhanh chóng làm đầy ổ cứng, gây treo dịch vụ và ảnh hưởng trực tiếp đến hoạt động của ứng dụng.
Bài viết này của InterData sẽ hướng dẫn bạn một cách chi tiết và chuyên sâu để làm chủ các file log. Chúng ta sẽ sử dụng Logrotate, một công cụ mạnh mẽ có sẵn trên hầu hết các hệ điều hành Linux. Bạn sẽ học được cách tự động xoay vòng, nén, và xóa các file log cũ một cách an toàn để đảm bảo VPS luôn hoạt động ổn định.
Tại sao phải giới hạn dung lượng file log?
Việc bỏ qua quản lý file log có thể dẫn đến những hậu quả nghiêm trọng hơn bạn nghĩ. Giới hạn dung lượng log không chỉ là một việc “nên làm”, mà là một yêu cầu bắt buộc để duy trì một hệ thống khỏe mạnh. Ba lý do chính yếu chứng minh tầm quan trọng của việc này.

Đầu tiên và quan trọng nhất là để tránh tình trạng đầy ổ cứng. Khi ổ cứng đạt 100% dung lượng, các dịch vụ quan trọng như cơ sở dữ liệu (MySQL, PostgreSQL) sẽ không thể ghi dữ liệu mới và ngừng hoạt động. Web server cũng sẽ không thể tạo file tạm, dẫn đến việc toàn bộ website hoặc ứng dụng của bạn bị sập.
Thứ hai, việc quản lý log giúp tối ưu hiệu suất server. Một file log khổng lồ sẽ làm chậm quá trình phân tích và gỡ lỗi. Khi cần tìm một thông tin cụ thể trong một file log vài Gigabyte, bạn sẽ tốn rất nhiều thời gian và tài nguyên hệ thống. Việc chia nhỏ file log giúp truy xuất thông tin nhanh chóng hơn.
Cuối cùng, giới hạn log giúp bạn tiết kiệm chi phí lưu trữ. Trên các nền tảng cloud hoặc khi sử dụng các gói VPS có dung lượng hạn chế, mỗi Gigabyte lưu trữ đều được tính phí. Việc nén và xóa các bản ghi không cần thiết giúp bạn giảm đáng kể chi phí vận hành hàng tháng.
Logrotate là gì? Công cụ mặc định tốt nhất
Logrotate là một tiện ích hệ thống được thiết kế chuyên biệt cho việc quản lý file log. Chức năng chính của Logrotate là tự động hóa quá trình xoay vòng (rotate), nén (compress), xóa (remove), và gửi (mail) các file log. Điều này giúp ngăn chặn các file log phát triển đến kích thước không thể kiểm soát.
Điểm mạnh lớn nhất của Logrotate là nó được cài đặt mặc định trên hầu hết các bản phân phối Linux phổ biến như Ubuntu, CentOS, Debian. Điều này biến Logrotate thành công cụ tiêu chuẩn và là lựa chọn hàng đầu cho các quản trị viên hệ thống. Bạn không cần cài đặt thêm phần mềm phức tạp mà có thể sử dụng ngay công cụ có sẵn.

Hướng dẫn sử dụng Logrotate để giới hạn file log
Đây là phần cốt lõi của bài viết, nơi chúng ta sẽ đi vào thực hành chi tiết. Các bước dưới đây sẽ giúp bạn cấu hình Logrotate một cách chính xác để quản lý file log cho các ứng dụng của mình.
Kiểm tra Logrotate đã cài đặt chưa
Trước khi bắt đầu, hãy đảm bảo Logrotate đã có trên hệ thống của bạn. Bạn có thể kiểm tra bằng cách mở terminal và chạy lệnh sau:
logrotate --version
Nếu hệ thống trả về phiên bản của Logrotate, bạn có thể tiếp tục. Nếu không, bạn cần cài đặt nó.
Trên Ubuntu/Debian:
sudo apt-get update
sudo apt-get install logrotate
Trên CentOS/RHEL/Fedora:
sudo yum install logrotate
Cấu trúc file cấu hình Logrotate
Logrotate sử dụng một file cấu hình chính và một thư mục chứa các cấu hình cho từng dịch vụ riêng lẻ.
/etc/logrotate.conf: Đây là file cấu hình chính. File này chứa các thiết lập mặc định áp dụng cho tất cả các file log, ví dụ như tần suất xoay vòng (weekly), số lượng file lưu trữ (rotate 4). Bạn nên hạn chế chỉnh sửa trực tiếp file này./etc/logrotate.d/: Đây là nơi bạn nên đặt các file cấu hình cho từng ứng dụng cụ thể. Logrotate sẽ tự động đọc tất cả các file trong thư mục này. Việc tách riêng cấu hình giúp quản lý dễ dàng hơn và không ảnh hưởng đến các thiết lập hệ thống chung.
Tạo file cấu hình riêng cho dịch vụ (Nginx, Apache)
Cách tốt nhất để quản lý log là tạo một file cấu hình riêng cho mỗi dịch vụ. Ví dụ, để quản lý log của Nginx, bạn hãy tạo một file mới tên là nginx trong thư mục /etc/logrotate.d/.
sudo nano /etc/logrotate.d/nginx
Sau đó, dán nội dung cấu hình sau vào file. Đây là một cấu hình mẫu rất phổ-biến và hiệu quả.
/var/log/nginx/*.log {
daily
size 100M
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 nginx adm
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Cấu hình này yêu cầu Logrotate kiểm tra các file log của Nginx hàng ngày, xoay vòng nếu file lớn hơn 100MB, giữ lại 14 bản sao, và nén chúng lại.
Giải thích các tùy chọn cấu hình phổ biến
Để hiểu rõ hơn về file cấu hình trên, hãy cùng phân tích các tùy chọn quan trọng nhất. Việc nắm vững các tùy chọn này cho phép bạn tùy chỉnh Logrotate theo bất kỳ nhu-cầu nào.
daily,weekly,monthly: Xác định tần suất xoay vòng log.dailylà hàng ngày,weeklylà hàng tuần.size [kích thước]: Xoay vòng log nếu kích thước file vượt quá một ngưỡng nhất định. Ví dụ:size 100M(100 Megabytes),size 1G(1 Gigabyte).rotate [số lượng]: Số lượng phiên bản log cũ được giữ lại.rotate 14sẽ giữ lại 14 file. Khi có file log thứ 15, file cũ nhất sẽ bị xóa.compress: Nén các file log đã xoay vòng, thường sử dụng gzip. Điều này giúp tiết kiệm đáng kể dung lượng lưu trữ.delaycompress: Hoãn việc nén file log gần nhất lại một chu kỳ. Điều này hữu ích khi bạn cần truy cập file log của ngày hôm trước mà không cần giải nén.missingok: Không báo lỗi nếu file log không tồn tại.notifempty: Không xoay vòng nếu file log trống.create [mode] [owner] [group]: Tạo lại một file log mới ngay sau khi xoay vòng, với quyền và chủ sở hữu được chỉ định. Ví dụ:create 0640 nginx adm.postrotate/endscript: Chạy các lệnh trong khối này sau khi quá trình xoay vòng hoàn tất. Đây là nơi để bạn thông báo cho ứng dụng biết rằng file log đã thay đổi, ví dụ như tải lại cấu hình Nginx.
Chạy và kiểm tra cấu hình
Sau khi tạo file cấu hình, bạn cần chắc chắn rằng nó không có lỗi cú pháp. Logrotate cung cấp chế độ “debug” để kiểm tra mà không thực sự xoay vòng file log.
Chạy lệnh sau:
sudo logrotate --debug /etc/logrotate.conf
Lệnh này sẽ mô phỏng quá trình xoay vòng và hiển thị những file nào sẽ được xử lý. Nếu file cấu hình nginx của bạn xuất hiện trong kết quả và không có thông báo lỗi, điều đó có nghĩa là bạn đã cấu hình thành công.
Mẹo bổ sung: Tìm và xử lý nhanh file log đang quá lớn
Trong trường hợp khẩn cấp khi VPS đã gần đầy, bạn cần hành động nhanh. Phần này cung cấp các lệnh giúp bạn xác định và xử lý các file log “thủ phạm” một cách an toàn.
Lệnh tìm file lớn
Để tìm 10 file hoặc thư mục lớn nhất trong /var/log, bạn có thể sử dụng lệnh du kết hợp với sort:
sudo du -sh /var/log/* | sort -rh | head -n 10
Lệnh này sẽ liệt kê các file và thư mục theo thứ tự dung lượng giảm dần, giúp bạn nhanh chóng thấy được mục nào đang chiếm nhiều không gian nhất.
Cách xóa file log an toàn
Một sai lầm phổ biến là dùng lệnh rm để xóa một file log đang được sử dụng bởi một dịch vụ. Việc này có thể gây lỗi vì dịch vụ vẫn giữ “file handle” của file đã bị xóa và không thể ghi vào file mới. Cách an toàn hơn là làm trống nội dung của file.
Bạn có thể sử dụng lệnh sau để xóa nội dung file mà không cần xóa file:
sudo truncate -s 0 /path/to/your/large/logfile.log
Hoặc một cách khác cũng rất phổ biến:
cat /dev/null > /path/to/your/large/logfile.log
Cả hai lệnh trên đều giữ nguyên file và các quyền của nó, nhưng giảm kích thước file về 0 byte. Dịch vụ sẽ tiếp tục ghi vào file này mà không bị gián đoạn.
Câu hỏi thường gặp (FAQ)
Logrotate có chạy tự động không?
Có. Logrotate thường được thực thi tự động mỗi ngày thông qua một cron job. Bạn có thể kiểm tra sự tồn tại của cron job này tại /etc/cron.daily/logrotate. Điều này đảm bảo rằng các quy tắc bạn đặt ra sẽ được áp dụng đều đặn mà không cần can thiệp thủ công.
Giới hạn log cho Docker container thì làm thế nào?
Docker có cơ chế quản lý log riêng gọi là “logging drivers”. Mặc định, Docker sử dụng json-file driver. Bạn có thể giới hạn kích thước log cho tất cả các container bằng cách chỉnh sửa file /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Cấu hình này giới hạn mỗi container chỉ có tối đa 3 file log, mỗi file không quá 10MB.
Có nên xóa file log bằng lệnh rm không?
Không nên. Như đã giải thích ở trên, khi bạn dùng rm để xóa một file đang được một tiến trình ghi vào, tiến trình đó vẫn giữ một tham chiếu đến file trong bộ nhớ. Nó sẽ tiếp tục ghi vào tham chiếu đó, và dung lượng ổ đĩa sẽ không được giải phóng cho đến khi tiến trình đó được khởi động lại. Luôn ưu tiên làm trống file bằng truncate hoặc cat /dev/null.
Quản lý log là một kỹ năng nền tảng và thiết yếu trong việc vận hành hệ thống. Bằng cách áp dụng các kỹ thuật với Logrotate trong bài viết này, bạn không chỉ giải quyết được vấn đề trước mắt mà còn xây dựng được một hệ thống bền vững, dễ bảo trì và có khả năng chống chịu lỗi tốt hơn trong tương lai.
