การจัดการ log ของ Server
เรื่องของเรื่อง คือ ผมตรวจพบว่าเนื้อที่บน Server ของผมหายไปอย่างรวดเร็ว และจากการตรวจสอบพบว่ามันหายไปเป็น log ไฟล์ขนาดใหญ่เกือบ 30G ผมก็เลยต้องหาวิธีมาจัดการกับ log ให้มีประสิทธิภาพ ด้วยการแยกเก็บ log เป็นรายวัน ซึ่งพระเอกของงานนี้คือ logrotate (โปรแกรมนี้มีติดตั้งและใช้งานบน Server อยู่แล้วนะครับ)
logrotate เป็นโปรแกรมสำหรับจัดการ log file ของ Server โดยจะทำหน้าที่ในการสำเนาไฟล์ log ของระบบเก็บไว้ และยังบีบอัดไฟล์ได้อีกด้วย ตาม พรบ.คอมพิวเตอร์ ปี พ.ศ. 2550 ที่มีการกำหนดให้ผู้ดูแลระบบต้องเก็บ log ของ Sever ไว้อย่างน้อย 90 วัน
คำสั่งของ logrotate ที่สามารถใช้งานได้
1. เปิดไฟล์ logrotate.conf ขึ้นมาแก้ไข ด้วย vim หรือจะใช้ editor อื่นใดก็ได้ที่ถนัด
ไฟล์นี้เป็นไฟล์ตั้งค่าหลักของ logrotate ครับ หากต้องการแก้ไข ผมแนะนำให้ใส่ # หน้าบรรทัดที่ต้องการแก้ไข แล้วเพิ่มข้อมูลใหม่ที่ต้องการลงในบรรทัดถัดไป
2. สำหรับใน CWP ไม่มีการ rotate ไฟล์ของ Apache ทำให้ขนาดของ log file ของ Apache ใหญ่มาก เราจะมา config ให้ logrotate จัดการกับ log file ของ Apache ด้วย
ขั้นตอนแรก สร้างไฟล์ /etc/logrotate.d/apache ก่อน (ถ้ามีอยู่แล้ว ให้เปิดมาแก้ไข)
ใส่โค้ดด้านล่างลงในไฟล์
ตัวอย่างนี้เป็นการกำหนดให้ logrotate ทำการสำเนาไฟล์ 3 ไฟล์ ตามด้านล่าง ทุกวัน เก็บไว้ที่ /var/log/httpd เป็นเวลา 120 วัน ทำการบีบอัดไฟล์ด้วย และเมื่อสำรองไฟล์แล้วให้ลบไฟล์ต้นฉบับออก
เสร็จแล้ว reboot Server ด้วยครับ
หมายเหตุ logrotate จะทำงานตามที่กำหนดโดย cron นะครับ สามารถดูได้ที่ /etc/cron.daily
logrotate เป็นโปรแกรมสำหรับจัดการ log file ของ Server โดยจะทำหน้าที่ในการสำเนาไฟล์ log ของระบบเก็บไว้ และยังบีบอัดไฟล์ได้อีกด้วย ตาม พรบ.คอมพิวเตอร์ ปี พ.ศ. 2550 ที่มีการกำหนดให้ผู้ดูแลระบบต้องเก็บ log ของ Sever ไว้อย่างน้อย 90 วัน
คำสั่งของ logrotate ที่สามารถใช้งานได้
- dateext กำหนดให้มีการ ใส่วันที่ต่อท้ายชื่อ log file ด้วย จะได้รู้ว่าวันไหน
- olddir /var/log ย้าย log file ไปยัง path ที่กำหนด จะได้รวม log ทั้งหมดไว้ที่เดียวกันเลย ถ้าไม่ระบุจะเป็นการเก็บ log file ลงใน path เดิม
- notifemply|ifempty กำหนดให้มีการเก็บ log file แม้ไฟล์จะว่างเปล่า (ifempty) หรือ ไม่เก็บหากไฟล์ว่างเปล่า (notifemply)
- copytruncate ใช้วิธี copy แล้วลบไฟล์เก่าออก
- delaycompress กำหนดให้มีการเลื่อนการบีบอัดไฟล์ไป 1 ครั้ง ซึ่งจะทำให้เราสามารถเปิดดูไฟล์ก่อนหน้าได้โดยไม่ต้องคลายไฟล์ก่อน
- compress กำหนดให้บีบอัด log file โดยใช้ gzip
- daily|weekly|monthly กำหนดคาบในการเก็บ log file daily = รายวัน, weekly = รายสัปดาห์, monthly = รายเดือน
- rotate 120 จำนวน log file ที่เก็บไว้ เกินกว่าที่กำหนดจะลบออก
- prerotage กำหนดให้มีการรันคำสั่งก่อนการ rotate
- postrotate กำหนดให้มีการรันคำสั่งหลังจาก ที่มีการ rotate ไปแล้ว
- endscript เป็นการจบคำสั่งของ prerotage และ postrotate
1. เปิดไฟล์ logrotate.conf ขึ้นมาแก้ไข ด้วย vim หรือจะใช้ editor อื่นใดก็ได้ที่ถนัด
vi /etc/logrotate.conf
ไฟล์นี้เป็นไฟล์ตั้งค่าหลักของ logrotate ครับ หากต้องการแก้ไข ผมแนะนำให้ใส่ # หน้าบรรทัดที่ต้องการแก้ไข แล้วเพิ่มข้อมูลใหม่ที่ต้องการลงในบรรทัดถัดไป
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
2. สำหรับใน CWP ไม่มีการ rotate ไฟล์ของ Apache ทำให้ขนาดของ log file ของ Apache ใหญ่มาก เราจะมา config ให้ logrotate จัดการกับ log file ของ Apache ด้วย
ขั้นตอนแรก สร้างไฟล์ /etc/logrotate.d/apache ก่อน (ถ้ามีอยู่แล้ว ให้เปิดมาแก้ไข)
vi /etc/logrotate.d/apache
ใส่โค้ดด้านล่างลงในไฟล์
/usr/local/apache/logs/access_log /usr/local/apache/logs/error_log /usr/local/apache/logs/suphp_log {
daily
missingok
rotate 120
compress
delaycompress
copytruncate
olddir /var/log/httpd
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}
ตัวอย่างนี้เป็นการกำหนดให้ logrotate ทำการสำเนาไฟล์ 3 ไฟล์ ตามด้านล่าง ทุกวัน เก็บไว้ที่ /var/log/httpd เป็นเวลา 120 วัน ทำการบีบอัดไฟล์ด้วย และเมื่อสำรองไฟล์แล้วให้ลบไฟล์ต้นฉบับออก
- access_log ไฟล์นี้เป็นไฟล์ที่ต้อง backup ตาม พรบ. นะครับ เป็นไฟล์ที่บอกว่ามี IP ใดเรียกเข้ามาบ้าง
- error_log ไฟล์นี้เป็นไฟล์เก็บข้อผิดพลาดต่างๆของ PHP
- suphp_log ไฟล์นี้เป็นไฟล์เก็บ log ของ PHP
เสร็จแล้ว reboot Server ด้วยครับ
หมายเหตุ logrotate จะทำงานตามที่กำหนดโดย cron นะครับ สามารถดูได้ที่ /etc/cron.daily