ตั้งค่า Logrotate บน Linux จัดการ Log ไฟล์ป้องกัน Disk Full

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 100Mrotate เมื่อไฟล์ใหญ่เกิน
copytruncatecopy แล้ว 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