GORAGOD.com

การจัดการ log ของ Server

เรื่องของเรื่อง คือ ผมตรวจพบว่าเนื้อที่บน Server ของผมหายไปอย่างรวดเร็ว และจากการตรวจสอบพบว่ามันหายไปเป็น log ไฟล์ขนาดใหญ่เกือบ 30G ผมก็เลยต้องหาวิธีมาจัดการกับ log ให้มีประสิทธิภาพ ด้วยการแยกเก็บ log เป็นรายวัน ซึ่งพระเอกของงานนี้คือ logrotate (โปรแกรมนี้มีติดตั้งและใช้งานบน Server อยู่แล้วนะครับ)

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
ตัวอย่างนี้จะเป็นการตั้งค่า logrotate บน CentOs ที่มีการใช้ CWP เป็น Web Control Panel นะครับ
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
ถ้าต้องการเพิ่มเติมไฟล์อื่นๆก็สามารถเพิ่มได้นะครับ ตามที่อยู่ใน /usr/local/apache/logs/

เสร็จแล้ว reboot Server ด้วยครับ

หมายเหตุ logrotate จะทำงานตามที่กำหนดโดย cron นะครับ สามารถดูได้ที่ /etc/cron.daily