เขียนเป็นแนวคิดที่จะลดขนาดของ log โดยเลิกเก็บสิ่งที่ไม่มีประโยชน์ที่จะเก็บ

บล๊อกนี้ไม่ค่อยได้เขียน และไม่ค่อยมีคนอ่านครับ แต่ว่ามีเรื่อง(ร่าง)ประกาศที่จะออกตาม พรบ.ความผิดทางคอมพิวเตอร์ โผล่ขึ้นมา ซึ่งแม้มีข่าวว่ากระทรวงไอซีทีจะมีท่าทีผ่อนคลายเรื่อง log ลงบ้าง ก็ต้องยอมรับว่าการเก็บ log file มีข้อดีอยู่เหมือนกัน นอกเหนือไปจากการจับตัวผู้กระทำผิดมาลงโทษตามกฏหมาย

log file ไม่ได้มีไว้ตะบี้ตะบันเก็บทุกอย่าง แต่มีไว้ให้รู้ว่าเกิดอะไรขึ้นกับระบบ แต่การออกแบบเว็บในปัจจุบันนี้ ถ้าไม่สวยหรูก็ไม่ดึงดูดผู้ใช้ ดังนั้นเว็บในปัจจุบันจึงประกอบไปด้วย icon และรูปประกอบต่างๆ มากมาย

ยกตัวอย่างหน้าแรกของ GotoKnow นี้ เมื่อกี้เพิ่งวิเคราะห์ดู พบว่ามีรูปประกอบ 86 รูป มี stylesheet อีกสามไฟล์ ถ้าอ่านหน้าแรกของ GotoKnow หนึ่งครั้ง จะเกิดการเขียน log file 90 บรรทัด (รูป 86 บรรทัด บวกกับการโหลด style sheet 3 บรรทัด บวกกับ html อีกบรรทัดหนึ่ง)

การเขียน log file จำนวนมหาศาลนี้ เป็นเหตให้ log file ของ GotoKnow มีขนาดประมาณวันละ 1 GB ตามที่อาจารย์จันทวรรณให้ข้อมูลไว้

รูปต่างๆ ในหน้าแรกของ GotoKnow เก็บไว้ใน directory

  • /images 34 รูป
  • /gotoknow 8 รูป
  • /profile 35 รูป
  • ที่เหลือกระจัดกระจายกัน อยู่ใน /file 6 รูป กับรูปนอก GotoKnow

รูปใน /images กับใน /gotoknow เป็นรูปประกอบของ GotoKnow ที่นิ่ง และมั่นใจได้ว่าไม่มีการละเมิดลิขสิทธิ์ (และไม่มีปัญหาใดๆ) ดังนั้นหากไม่เก็บ log รูปจาก 2 directories นี้ ก็จะลด log entry จาก 90 บรรทัดต่อหน้า เหลือ 48 บรรทัด (ลดเหลือ 53%) และจะลดขนาดของ log ลงได้ประมาณครึ่งหนึ่ง (ประหยัดประมาณวันละ 500 MB uncompressed หรือ 125 MB compress แล้ว) ลด disk I/O ลงได้มาก

ผมไม่ได้เสนอให้เลิกเก็บ log ใต้ /profile เพราะส่วนนั้นเป็นส่วนที่สมาชิก (หรือแฮ็กเกอร์) สามารถอัพโหลดได้

Apache Access Log 

Apache สามารถทำ Conditional Log ได้ โดยเทียบ Requested URI กับ Regular expression ที่กำหนดไว้ แล้ว Set environment ผ่านไปยัง log module ได้ เช่นจะไม่เก็บอะไรก็ตามที่อยู่ใต้ /images และ /gotoknow ก็ใช้

SetEnvIf Request_URI "^/robots\.txt$" dontlog
SetEnvIf Request_URI "^/images/" dontlog
SetEnvIf Request_URI "^/gotoknow/" dontlog
CustomLog logs/access_log common env=!dontlog

Log Rotation 

log file ของ apache เขียนเป็นไฟล์อันเดียว แบบนี้จะมีปัญหาการจัดการหากจะต้องเก็บไว้เป็นเวลา 90 วัน คือหากจะต้องมาแงะ log เก่าๆ ที่มีอายุเกิน 90 วันออก ก็จะวุ่นวาย

Apache มีโปรแกรมช่วยเรียกว่า logrotate (บางทีเรียก rotatelogs หรือชื่ออื่นๆ) ซึ่งเปลี่ยน log file ทุกๆ เวลาที่กำหนด เราสามารถใช้โปรแกรมนี้ได้ครับ ด้วยวิธีการดังนี้ 

CommonLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common

หมายความว่าให้ rotate log file ทุกๆ 86400 วินาที (24 ชั่วโมง); เมื่อ rotate log file แล้ว โปรแกรมที่เป็น filter จะเขียน log ลงไฟล์ใหม่แทน log อันเก่าที่ถูก rename ไปเป็นชื่ออื่นแล้ว

การ rotate log ทุกๆ 24 ชั่วโมง ก็หมายความว่าไฟล์ที่มีอายุเกิน 90 วัน สามารถลบทิ้งไปได้เลย โดยไม่ละเมิดพรบ.ความผิดทางคอมพิวเตอร์

นอกจากนี้ ก็ยังสามารถ compress log file เก่าๆ เพื่อประหยัดเนื้อที่ได้ด้วย เนื่องจาก log file เป็น text ธรรมดา การ compress log file น่าจะลดขนาดของเนื้อที่ลงได้เหลือ 25% (ตามทฤษฎี)