ไฟล์ 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

