VPS ที่รัน Web Server, Database และ Application พร้อมกันจะสะสม Log ไฟล์อย่างต่อเนื่อง หาก Disk เต็มจาก Log ไฟล์ เว็บไซต์จะล่มและ Database จะหยุดเขียนข้อมูล Logrotate คือเครื่องมือมาตรฐานบน Linux ที่หมุนเวียน Archive และลบ Log เก่าโดยอัตโนมัติ
Logrotate คืออะไร
Logrotate เป็น utility ที่จัดการ Log ไฟล์โดย: rename ไฟล์เก่า สร้างไฟล์ใหม่ บีบอัด archive ด้วย gzip/bzip2 และลบไฟล์ที่เก่าเกินกำหนด ทำงานผ่าน cron รายวันโดยอัตโนมัติ
ไฟล์ Config หลัก
/etc/logrotate.conf # ค่า global default
/etc/logrotate.d/ # config แยกแต่ละ service
/var/lib/logrotate/status # tracking สถานะ
# ดู global config
cat /etc/logrotate.conf
Option สำคัญที่ต้องรู้
| Option | ความหมาย |
|---|---|
daily/weekly/monthly | ความถี่การ rotate |
rotate N | เก็บกี่ไฟล์ (N รอบที่ผ่านมา) |
compress | บีบอัดด้วย gzip |
delaycompress | เลื่อนบีบอัดไปรอบถัดไป |
missingok | ไม่ error ถ้าไฟล์หาย |
notifempty | ข้ามถ้าไฟล์ว่าง |
create 640 user group | สร้างไฟล์ใหม่พร้อม permission |
postrotate/endscript | รัน command หลัง rotate |
size 100M | rotate เมื่อไฟล์ใหญ่เกิน |
copytruncate | copy แล้ว truncate แทน rename |
ตั้งค่า Logrotate สำหรับ Nginx
# ดู config ที่ Ubuntu ตั้งไว้ให้
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Config นี้: rotate ทุกวัน เก็บ 14 วัน บีบอัด ส่ง signal USR1 ให้ Nginx เปิด log ไฟล์ใหม่หลัง rotate
ตั้งค่า Logrotate สำหรับ MySQL/MariaDB
sudo nano /etc/logrotate.d/mysql
/var/log/mysql/mysql-slow.log
/var/log/mysql/error.log {
daily
rotate 7
missingok
compress
delaycompress
notifempty
create 640 mysql adm
postrotate
# ส่ง signal ให้ MySQL flush logs
mysqladmin -u root -p'YOUR_ROOT_PASSWORD' flush-logs 2>/dev/null
endscript
}
ตั้งค่า Logrotate สำหรับ Application Log
sudo nano /etc/logrotate.d/myapp
/var/www/myapp/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
copytruncate # ใช้ copytruncate ถ้า app ไม่ support reload
su www-data www-data
}
ตั้งค่า Logrotate ด้วย Size แทน Date
/var/log/myapp/access.log {
size 100M # rotate เมื่อไฟล์ใหญ่เกิน 100MB
rotate 5 # เก็บ 5 ไฟล์
compress
missingok
copytruncate
}
ทดสอบและ Debug
# Debug mode — แสดงว่าจะทำอะไร (ไม่แก้ไฟล์จริง)
sudo logrotate -d /etc/logrotate.conf
# Force rotate ทันที (ไม่ดูเงื่อนไข)
sudo logrotate -f /etc/logrotate.d/nginx
# Verbose output
sudo logrotate -v /etc/logrotate.conf
# ตรวจสถานะล่าสุดของแต่ละไฟล์
sudo cat /var/lib/logrotate/status
เคล็ดลับ: ก่อน deploy config ใหม่ รัน sudo logrotate -d /etc/logrotate.d/yourconfig เสมอ เพื่อดูว่า logrotate ตีความ config อย่างไร โดยไม่แตะไฟล์จริง
Monitor Disk Usage
# ดู disk usage รวม
df -h
# ดูว่าโฟลเดอร์ไหนกินพื้นที่มาก
du -sh /var/log/* | sort -rh | head -20
# ดู log ไฟล์ใหญ่สุด
find /var/log -type f -size +100M -exec ls -lh {} \;
Journal Log (systemd)
บน Ubuntu ที่ใช้ systemd Journal Log อาจกินพื้นที่มากด้วย ตรวจและล้างได้ดังนี้
# ดูขนาด journal
journalctl --disk-usage
# จำกัดขนาด journal (เก็บแค่ 500MB)
sudo journalctl --vacuum-size=500M
# จำกัดตามเวลา (เก็บแค่ 30 วัน)
sudo journalctl --vacuum-time=30d
# ตั้งค่า permanent ใน /etc/systemd/journald.conf
sudo nano /etc/systemd/journald.conf
# เพิ่ม:
SystemMaxUse=500M
MaxRetentionSec=30day
sudo systemctl restart systemd-journald
ต้องการ VPS Linux พร้อม Full Control?
AsiaGB มี VPS Ubuntu/Debian ที่จัดการ Log ได้เต็มที่ เริ่มต้น 500 บาท/เดือน Root Access ครบทุก command
ดู VPS Plans