Hướng Dẫn Cấu Hình Logrotate Trên VPS Ubuntu Tránh Đầy Ổ Đĩa

Hướng dẫn cấu hình logrotate trên VPS Ubuntu để tự xoay vòng, nén và xóa log cũ, tránh đầy ổ đĩa. Kèm cách test bằng --debug, --force và xử lý lỗi permission.

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.

Điểm quan trọng Hãy lựa chọn dịch vụ dựa trên nhu cầu sử dụng thực tế và theo dõi tài nguyên thường xuyên để có hiệu quả tốt nhất.

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 copytruncate trong 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:

  1. kiểm tra file lớn;
  2. xem config /etc/logrotate.d/nginx;
  3. kiểm tra timer;
  4. chạy debug;
  5. force rotate nếu phù hợp;
  6. kiểm tra Nginx reopen log;
  7. phân tích traffic bất thường/bot;
  8. 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 compress nế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

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 →