Log Rotation — logrotate Configuration บน Linux

ไฟล์ Log บน Server ที่ทำงานตลอด 24 ชั่วโมงจะโตขึ้นเรื่อย ๆ หากไม่มีการจัดการอาจทำให้ Disk เต็มและ Service หยุดทำงานได้ Log Rotation คือกระบวนการหมุนเวียนไฟล์ Log โดยอัตโนมัติ เก็บ Log เก่าไว้ตามจำนวนที่กำหนด และลบ Log ที่เก่าเกินออก บน Linux เครื่องมือมาตรฐานสำหรับงานนี้คือ logrotate

บทความนี้อธิบายการตั้งค่า logrotate ตั้งแต่ Config File พื้นฐาน Directives ที่ใช้บ่อย การสร้าง Custom Config สำหรับ Application เฉพาะ และการทดสอบ Config ก่อน Deploy

logrotate คืออะไร

logrotate ทำงานผ่าน Cron Job (ปกติรันทุกวันผ่าน /etc/cron.daily/logrotate) โดยอ่าน Config จาก /etc/logrotate.conf และ Config ย่อยใน /etc/logrotate.d/ เมื่อถึงเงื่อนไข (เช่น ขนาดเกิน 100MB หรือผ่าน 7 วัน) จะ Rotate ไฟล์ Log นั้น

# ตรวจสอบว่า logrotate ติดตั้งอยู่
which logrotate
logrotate --version

# ดู Config หลัก
cat /etc/logrotate.conf

# ดู Config ย่อย
ls /etc/logrotate.d/

รูปแบบ Config File

/var/log/example.log {
    daily           # Rotate ทุกวัน
    rotate 7        # เก็บ Log เก่าไว้ 7 ชุด
    compress        # บีบอัดไฟล์เก่าด้วย gzip
    delaycompress   # บีบอัด Log ชุดก่อนหน้า ไม่ใช่ชุดล่าสุด
    missingok       # ไม่ Error ถ้าไฟล์ไม่มีอยู่
    notifempty      # ไม่ Rotate ถ้าไฟล์ว่างเปล่า
    create 0640 www-data adm   # สร้างไฟล์ใหม่พร้อม Permission
    sharedscripts   # รัน postrotate script ครั้งเดียว
    postrotate
        /usr/bin/killall -HUP rsyslogd 2>/dev/null || true
    endscript
}

Directives ที่ใช้บ่อย

กำหนดช่วงเวลา Rotate

daily       # Rotate ทุกวัน
weekly      # Rotate ทุกสัปดาห์
monthly     # Rotate ทุกเดือน
yearly      # Rotate ทุกปี
size 100M   # Rotate เมื่อไฟล์ขนาดเกิน 100MB
size 1G     # Rotate เมื่อขนาดเกิน 1GB

กำหนดจำนวนที่เก็บ

rotate 7     # เก็บ Log เก่า 7 ชุด (ชุดเก่าสุดจะถูกลบ)
rotate 30    # เก็บ 30 ชุด
rotate 0     # ไม่เก็บ — ลบทิ้งเลย

การบีบอัดและสร้างไฟล์

compress          # บีบอัดด้วย gzip (สร้างไฟล์ .gz)
nocompress        # ไม่บีบอัด
delaycompress     # บีบอัด Log ชุดที่แล้ว (ไม่ใช่ชุดล่าสุด) — ใช้คู่กับ compress เสมอ
compresscmd /usr/bin/bzip2    # ใช้ bzip2 แทน gzip

create            # สร้างไฟล์ Log ใหม่หลัง Rotate
create 0644 root root         # ระบุ Permission, Owner, Group
nocreate          # ไม่สร้างไฟล์ใหม่ (ใช้เมื่อ App สร้างเอง)

copytruncate      # Copy แล้ว Truncate (สำหรับ App ที่เปิดไฟล์ Log ค้างไว้)

การจัดการข้อผิดพลาดและเงื่อนไข

missingok     # ไม่ Error ถ้าไฟล์หาย
notifempty    # ไม่ Rotate ถ้าไฟล์ว่างเปล่า
ifempty       # Rotate แม้ไฟล์ว่าง (ค่าเริ่มต้น)
dateext       # ใส่วันที่ในชื่อไฟล์ (เช่น access.log-20260416.gz แทน access.log.1.gz)
dateformat -%Y%m%d  # กำหนดรูปแบบวันที่สำหรับ dateext

postrotate และ prerotate Scripts

บาง Application ต้องได้รับสัญญาณเพื่อ Reload Log File Handle หลังจาก Rotate เช่น nginx ต้องรับ Signal USR1 เพื่อเปิดไฟล์ Log ใหม่

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        # ส่ง Signal ให้ nginx เปิดไฟล์ Log ใหม่
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 $(cat /var/run/nginx.pid)
        fi
    endscript
}

# Apache — ใช้ graceful restart
/var/log/apache2/*.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        /usr/sbin/apache2ctl graceful > /dev/null 2>&1 || true
    endscript
}

Config สำหรับ Application ต่าง ๆ

# MySQL/MariaDB
/var/log/mysql/error.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 640 mysql adm
    postrotate
        mysqladmin flush-logs 2>/dev/null || true
    endscript
}

# Application Log ทั่วไปที่เปิดไฟล์ค้าง (ใช้ copytruncate)
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate   # Copy แล้ว Truncate — ไม่ต้องส่ง Signal
}

ทดสอบ Config ก่อน Deploy

ก่อน Deploy Config ใหม่ควรทดสอบด้วย --debug และ --dry-run เพื่อตรวจสอบว่า Config ถูกต้องและจะ Rotate ไฟล์ใดบ้าง

# ตรวจสอบ Syntax ของ Config ไฟล์ (ไม่รัน Rotate จริง)
logrotate --debug /etc/logrotate.d/myapp

# Dry Run — แสดงว่าจะทำอะไรบ้างโดยไม่แก้ไขไฟล์จริง
logrotate --dry-run /etc/logrotate.conf

# รัน logrotate ด้วยมือทันที (Force Rotate แม้ยังไม่ถึงเวลา)
sudo logrotate --force /etc/logrotate.d/myapp

# รัน logrotate ทั้งหมด (เหมือนที่ Cron รัน)
sudo logrotate /etc/logrotate.conf

ดูสถานะ logrotate

# ดู State File — บันทึกว่า Rotate ล่าสุดเมื่อไหร่
cat /var/lib/logrotate/status
cat /var/lib/logrotate.status   # บางระบบอาจอยู่ที่นี่

# ตัวอย่าง Output
# logrotate state -- version 2
# "/var/log/nginx/access.log" 2026-4-16-3:0:0
# "/var/log/nginx/error.log" 2026-4-16-3:0:0

สร้าง Custom Config สำหรับ Application

# สร้างไฟล์ใหม่ใน /etc/logrotate.d/
sudo nano /etc/logrotate.d/myapp

# ตัวอย่าง Config ครบรูปแบบ
/var/log/myapp/app.log
/var/log/myapp/error.log {
    daily
    rotate 30
    size 50M
    compress
    delaycompress
    missingok
    notifempty
    dateext
    dateformat -%Y%m%d
    create 0640 deploy deploy
    sharedscripts
    postrotate
        systemctl reload myapp 2>/dev/null || true
    endscript
}

# ทดสอบ
sudo logrotate --debug /etc/logrotate.d/myapp

ตัวอย่างผลลัพธ์หลัง Rotate

# ก่อน Rotate
/var/log/nginx/access.log

# หลัง Rotate (แบบ Default)
/var/log/nginx/access.log          # ไฟล์ใหม่ว่างเปล่า
/var/log/nginx/access.log.1.gz     # Log ชุดล่าสุด (บีบอัด)
/var/log/nginx/access.log.2.gz     # Log ชุดก่อนหน้า
...
/var/log/nginx/access.log.7.gz     # Log เก่าสุด (จะถูกลบรอบต่อไป)

# หลัง Rotate แบบ dateext
/var/log/nginx/access.log
/var/log/nginx/access.log-20260416.gz
/var/log/nginx/access.log-20260415.gz

สรุป

logrotate เป็นเครื่องมือมาตรฐานสำหรับ Log Rotation บน Linux ที่ทำงานผ่าน Cron ทุกวัน Config ไฟล์อยู่ใน /etc/logrotate.conf และ /etc/logrotate.d/ Directives สำคัญคือ daily/weekly/size สำหรับกำหนดเวลา Rotate, rotate N สำหรับจำนวนชุดที่เก็บ, compress และ delaycompress สำหรับบีบอัด, และ postrotate สำหรับส่ง Signal ให้ Application เปิดไฟล์ใหม่ ควรทดสอบ Config ด้วย --debug ก่อน Deploy เสมอ

แนะนำบริการ DE

การจัดการ Log Rotation บน Server จริงต้องการสิทธิ์ Root เพื่อแก้ไข Config และรัน logrotate Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบเหมาะสำหรับตั้งค่า logrotate สำหรับ Application ต่าง ๆ และจัดการ Disk Space บน Production Server

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Log Rotation เอง Cloud Hosting ของ DE มีระบบจัดการ Log อัตโนมัติและให้เข้าถึง Error Log ผ่าน Control Panel