Log file có thể âm thầm chiếm hết dung lượng VPS Ubuntu nếu ứng dụng ghi dữ liệu liên tục mà không có cơ chế xoay vòng. Nginx, PHP, ứng dụng Node.js, Python, worker hoặc script tự viết đều có thể tạo log tăng hàng trăm MB đến nhiều GB theo thời gian. Ubuntu dùng `logrotate` để tự động rotate, compress, giữ lại một số phiên bản log cũ và xóa bản quá hạn theo lịch. Bài viết này hướng dẫn cách kiểm tra logrotate, tạo cấu hình riêng trong `/etc/logrotate.d/`, hiểu các tùy chọn `daily`, `weekly`, `rotate`, `size`, `compress`, `delaycompress`, `copytruncate`, `create`, `postrotate`, test bằng `--debug` và `--force`, đồng thời chỉ ra những lỗi phổ biến có thể khiến ứng dụng mất log hoặc disk vẫn tiếp tục đầy.
Một VPS Ubuntu có thể hết dung lượng không phải vì website hay database lớn, mà chỉ vì log tăng liên tục trong nhiều tuần. Những file như access log, error log, application log hoặc debug log nếu không được quản lý có thể chiếm hàng GB và làm hệ thống gặp lỗi update, database không ghi được dữ liệu hoặc ứng dụng crash.
Ubuntu sử dụng logrotate để tự động:
- đổi tên log cũ;
- tạo log mới;
- nén log cũ;
- giữ lại một số phiên bản;
- xóa log quá hạn;
- chạy script sau khi rotate nếu cần.
Nếu bạn đang theo dõi disk trên VPS, có thể kết hợp bài này với Các lệnh Linux cơ bản trên VPS Ubuntu để kiểm tra df, du, journalctl và file log.
1. Logrotate là gì?
logrotate là công cụ quản lý log file định kỳ trên Linux.
Theo Ubuntu manpage, logrotate có thể xử lý log theo:
- ngày;
- tuần;
- tháng;
- kích thước;
- số phiên bản cần giữ.
Ngoài ra, log cũ có thể được nén hoặc gửi qua email tùy cấu hình.
2. Vì sao VPS dễ đầy disk vì log?
Một số nguyên nhân phổ biến:
- Nginx access log ghi mọi request;
- ứng dụng bật debug trên production;
- worker ghi lỗi lặp lại liên tục;
- bot Internet quét website;
- container ghi stdout không giới hạn;
- app tự tạo file log riêng nhưng không rotate;
- database tạo slow query log lớn.
Nếu log tăng 200 MB mỗi ngày, sau một tháng đã có thể chiếm khoảng 6 GB.
3. Kiểm tra dung lượng disk
df -h
Tìm thư mục lớn:
sudo du -xh /var --max-depth=1 | sort -h
Tìm file log lớn:
sudo find /var/log -type f -size +100M -exec ls -lh {} \;
4. Kiểm tra logrotate đã cài chưa
logrotate --version
Hoặc:
dpkg -l | grep logrotate
Nếu chưa có:
sudo apt update
sudo apt install logrotate -y
5. Cấu hình chính của logrotate
File chính thường là:
/etc/logrotate.conf
Bên trong thường include:
/etc/logrotate.d/
Vì vậy, mỗi ứng dụng nên có file riêng trong /etc/logrotate.d/ thay vì sửa tất cả vào một file lớn.
6. Xem các cấu hình hiện có
ls -la /etc/logrotate.d/
Bạn có thể thấy cấu hình cho:
- nginx;
- apt;
- dpkg;
- rsyslog;
- fail2ban;
- ứng dụng khác.
7. Ví dụ cấu hình log app cơ bản
Giả sử app ghi log tại:
/var/log/myapp/app.log
Tạo:
sudo nano /etc/logrotate.d/myapp
Nội dung:
/var/log/myapp/app.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 appuser appuser
}
8. daily nghĩa là gì?
daily
Yêu cầu log được xem xét rotate theo chu kỳ ngày.
Các lựa chọn khác gồm:
weekly
monthly
hourly
Nhưng logrotate cần được chạy với tần suất phù hợp để tiêu chí có hiệu lực.
9. rotate 14
rotate 14
Giữ lại 14 phiên bản log cũ.
Nếu chạy daily, đây thường tương đương khoảng 14 ngày lịch sử, nhưng còn phụ thuộc việc log có được rotate mỗi ngày hay không.
10. compress
compress
Nén log cũ để tiết kiệm dung lượng.
Log text thường nén rất tốt.
Ví dụ:
app.log.1.gz
app.log.2.gz
11. delaycompress
delaycompress
Trì hoãn nén log vừa rotate một chu kỳ.
Điều này hữu ích với một số ứng dụng vẫn còn giữ file descriptor hoặc cần đọc log gần nhất.
12. missingok
missingok
Không báo lỗi nếu file log chưa tồn tại.
Phù hợp với app không phải lúc nào cũng tạo log.
13. notifempty
notifempty
Không rotate nếu file log rỗng.
Giúp tránh tạo nhiều file log trống không cần thiết.
14. create
Ví dụ:
create 0640 appuser appuser
Sau khi rotate, logrotate tạo file log mới với:
- mode 0640;
- owner
appuser; - group
appuser.
Nếu owner/group sai, ứng dụng có thể không ghi log được sau rotate.
15. Rotate theo kích thước
Bạn có thể dùng:
size 100M
Ví dụ:
/var/log/myapp/app.log {
size 100M
rotate 10
compress
missingok
notifempty
}
Logrotate sẽ cân nhắc rotate khi file đạt kích thước cấu hình và task được chạy.
16. maxsize khác size thế nào?
size dùng kích thước như điều kiện chính.
maxsize có thể dùng cùng lịch như daily/weekly để rotate sớm nếu log vượt ngưỡng trước thời điểm lịch định kỳ.
Ví dụ:
daily
maxsize 500M
Hãy kiểm tra manpage theo phiên bản logrotate của hệ thống trước khi dùng các option nâng cao.
17. Ứng dụng giữ file log đang mở thì sao?
Đây là vấn đề quan trọng.
Nếu logrotate đổi tên file nhưng process vẫn giữ file descriptor cũ, app có thể tiếp tục ghi vào file đã rotate thay vì file mới.
Có hai hướng chính:
- yêu cầu app reopen log bằng signal/reload;
- dùng
copytruncatetrong một số trường hợp.
18. copytruncate
Ví dụ:
copytruncate
Logrotate copy nội dung file hiện tại sang file rotated rồi truncate file gốc về 0.
Ưu điểm: app không cần reopen log.
Nhược điểm: có một khoảng rất ngắn dữ liệu có thể bị mất giữa copy và truncate.
Không nên dùng nếu ứng dụng hỗ trợ reopen log đúng cách.
19. postrotate
Với service hỗ trợ reload log, bạn có thể dùng:
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
Script chạy sau rotate.
Cách cụ thể phụ thuộc app. Không nên reload/restart service nếu ứng dụng không cần.
20. sharedscripts
Nếu một block logrotate xử lý nhiều file, sharedscripts giúp postrotate chỉ chạy một lần thay vì cho từng log.
Ví dụ thường thấy ở Nginx.
21. Xem cấu hình Nginx có sẵn
cat /etc/logrotate.d/nginx
Bạn có thể học cách package chính thức xử lý postrotate/signal để Nginx reopen log.
Không nên sửa file package nếu không cần; có thể tạo override hoặc cấu hình app riêng.
22. Test cấu hình bằng debug
Dùng:
sudo logrotate --debug /etc/logrotate.conf
Hoặc chỉ một file:
sudo logrotate --debug /etc/logrotate.d/myapp
--debug mô phỏng logic và không rotate thật.
Đây là bước nên làm trước production.
23. Force rotate để kiểm tra thật
sudo logrotate --force /etc/logrotate.d/myapp
Sau đó kiểm tra:
ls -lh /var/log/myapp/
Và xác nhận app vẫn ghi được log mới.
24. Kiểm tra state của logrotate
Logrotate lưu trạng thái để biết lần rotate gần nhất.
File thường ở:
/var/lib/logrotate/status
Xem:
sudo cat /var/lib/logrotate/status
Không nên xóa file state tùy tiện nếu không hiểu tác động.
25. Logrotate được chạy bằng gì?
Tùy phiên bản Ubuntu, logrotate có thể được kích hoạt qua systemd timer.
Kiểm tra:
systemctl list-timers | grep logrotate
Bạn có thể thấy:
logrotate.timer
Kiểm tra:
systemctl status logrotate.timer
26. Chạy logrotate thủ công
sudo logrotate /etc/logrotate.conf
Lệnh này chỉ rotate những file đủ điều kiện theo state/config.
Nếu cần ép:
sudo logrotate -f /etc/logrotate.conf
27. Tạo logrotate cho Node.js app
Ví dụ app ghi:
/var/log/node-api/app.log
Cấu hình:
/var/log/node-api/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
}
Nếu Node.js app có thư viện logging hỗ trợ reopen/rotate riêng, nên dùng cơ chế native thay vì copytruncate nếu phù hợp.
28. Python app
Tương tự, nếu Python app dùng RotatingFileHandler hoặc TimedRotatingFileHandler, bạn có thể để application tự quản lý log.
Không nên vừa để app rotate vừa để logrotate rotate cùng file mà không hiểu tương tác.
29. Docker log có dùng logrotate trực tiếp được không?
Docker có logging driver và option rotate riêng.
Với json-file, nên cấu hình max-size và max-file trong Docker daemon hoặc Compose phù hợp.
Không nên can thiệp trực tiếp vào file JSON log của Docker bằng logrotate nếu Docker không được cấu hình tương thích.
30. Journalctl có làm đầy disk không?
Systemd journal cũng chiếm dung lượng riêng.
Kiểm tra:
journalctl --disk-usage
Cấu hình journal nằm ở:
/etc/systemd/journald.conf
Logrotate không quản lý toàn bộ journal binary theo cách quản lý file text thông thường.
31. Dọn journal cũ
Ví dụ giữ dung lượng tối đa tạm thời:
sudo journalctl --vacuum-size=500M
Hoặc theo thời gian:
sudo journalctl --vacuum-time=14d
Không nên dùng dọn thủ công hằng ngày thay cho cấu hình retention đúng.
32. Tìm log lớn nhất toàn VPS
sudo find /var/log -type f -printf '%s %p\n' | sort -nr | head -20
Hoặc dễ đọc hơn:
sudo du -ah /var/log | sort -h | tail -30
33. Disk đầy 100% thì logrotate có chạy được không?
Có thể gặp khó khăn vì hệ thống không còn chỗ để tạo file mới hoặc nén.
Trước tiên cần giải phóng một ít dung lượng an toàn:
- xóa cache tạm;
- dọn backup cũ đã xác minh;
- vacuum journal;
- truncate log khẩn cấp nếu hiểu ứng dụng.
Không xóa file database hoặc log đang dùng chỉ để lấy chỗ trống.
34. Có nên dùng truncate -s 0?
Trong tình huống khẩn cấp, bạn có thể:
sudo truncate -s 0 /path/to/huge.log
Nhưng việc này xóa toàn bộ nội dung log hiện tại.
Chỉ dùng khi đã xác định file có thể mất nội dung và không cần giữ phục vụ điều tra.
Sau đó vẫn phải sửa logrotate/ứng dụng để lỗi không quay lại.
35. Permission denied khi logrotate
Kiểm tra:
- owner thư mục;
- owner log;
create;- service user;
- parent directory;
- AppArmor/SELinux nếu có.
Chạy debug:
sudo logrotate -d /etc/logrotate.d/myapp
36. Log mới tạo nhưng app không ghi được
Nguyên nhân thường là create sai user/group.
Kiểm tra process:
ps aux | grep myapp
Kiểm tra file:
ls -l /var/log/myapp/app.log
Sửa create theo đúng service user.
37. Log vẫn tăng dù đã rotate
Có thể process đang tiếp tục ghi vào inode cũ.
Kiểm tra deleted-but-open file:
sudo lsof +L1
Nếu process giữ file log cũ đã xóa/rotate, bạn cần reload/restart app đúng cách.
38. Monitoring disk quan trọng hơn chỉ logrotate
Logrotate giúp quản lý log, nhưng bạn vẫn cần alert disk usage.
Có thể dùng Uptime Kuma cho availability, còn disk metric nên dùng Netdata, Prometheus/node_exporter hoặc monitoring khác.
39. Tình huống thực tế: Nginx access log tăng 20 GB
Quy trình:
- kiểm tra file lớn;
- xem config
/etc/logrotate.d/nginx; - kiểm tra timer;
- chạy debug;
- force rotate nếu phù hợp;
- kiểm tra Nginx reopen log;
- phân tích traffic bất thường/bot;
- thêm monitoring disk.
Không chỉ xóa file rồi bỏ qua nguyên nhân traffic.
40. Tình huống thực tế: app ghi debug log mỗi request
Nếu production app bật debug, logrotate chỉ giảm hậu quả chứ không giải quyết nguyên nhân.
Hãy:
- giảm log level;
- sửa lỗi loop;
- sampling nếu cần;
- rotate;
- monitor.
41. Checklist cấu hình logrotate
- Xác định log file cần quản lý.
- Kiểm tra tốc độ tăng log.
- Tạo file trong
/etc/logrotate.d/. - Chọn daily/weekly/size hợp lý.
- Cấu hình
rotate. - Bật
compressnếu phù hợp. - Xác định
createđúng owner. - Chọn reload hoặc
copytruncate. - Chạy
--debug. - Force test.
- Xác nhận app vẫn ghi log.
- Theo dõi disk.
42. FAQ về logrotate trên VPS Ubuntu
Logrotate có tự chạy không?
Trên Ubuntu hiện đại thường được kích hoạt định kỳ bằng systemd timer hoặc cơ chế hệ thống tương ứng.
Có nên dùng copytruncate cho mọi ứng dụng?
Không. Nếu app hỗ trợ reopen log bằng signal/reload, cách đó thường tốt hơn.
compress có làm mất log không?
Không, nó nén log cũ. Bạn vẫn có thể đọc bằng zless hoặc zgrep.
Làm sao test mà không rotate thật?
Dùng:
sudo logrotate --debug /etc/logrotate.d/myapp
Làm sao ép rotate?
Dùng:
sudo logrotate --force /etc/logrotate.d/myapp
Logrotate có quản lý journalctl không?
Không theo cách quản lý file text thông thường. Systemd journal có cơ chế retention riêng.
Kết luận
Cấu hình logrotate trên VPS Ubuntu là bước cần thiết nếu ứng dụng tự ghi log ra file. Một cấu hình tốt giúp giới hạn dung lượng, giữ lịch sử vừa đủ và tránh disk bị lấp đầy âm thầm.
Hãy test bằng --debug, xác nhận owner của log mới, và chỉ dùng copytruncate khi ứng dụng không thể reopen log theo cách tốt hơn.
Nếu bạn đang chạy website, API hoặc worker trên VPS Ubuntu tại HUONG CLOUD, hãy kết hợp logrotate với monitoring disk và backup để tránh sự cố “No space left on device” làm gián đoạn dịch vụ.
Nguồn tham khảo
- Ubuntu manpage – logrotate: https://manpages.ubuntu.com/manpages/jammy/man8/logrotate.8.html
- Ubuntu manpage repository: https://manpages.ubuntu.com/
- systemd journal documentation: https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html
Kết luận
Nếu chưa chắc cấu hình hoặc loại dịch vụ nào phù hợp, hãy gửi nhu cầu thực tế để đội ngũ hỗ trợ tư vấn trước khi mua.
Chưa biết nên chọn gói nào?
Xem bảng giá VPS hoặc liên hệ đội ngũ hỗ trợ để chọn cấu hình phù hợp.
Xem bảng giá VPS →