บล๊อกนี้ไม่ค่อยได้เขียน และไม่ค่อยมีคนอ่านครับ แต่ว่ามีเรื่อง(ร่าง)ประกาศที่จะออกตาม พรบ.ความผิดทางคอมพิวเตอร์ โผล่ขึ้นมา ซึ่งแม้มีข่าวว่ากระทรวงไอซีทีจะมีท่าทีผ่อนคลายเรื่อง 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 กับใน /gotoknow เป็นรูปประกอบของ GotoKnow ที่นิ่ง และมั่นใจได้ว่าไม่มีการละเมิดลิขสิทธิ์ (และไม่มีปัญหาใดๆ) ดังนั้นหากไม่เก็บ log รูปจาก 2 directories นี้ ก็จะลด log entry จาก 90 บรรทัดต่อหน้า เหลือ 48 บรรทัด (ลดเหลือ 53%) และจะลดขนาดของ log ลงได้ประมาณครึ่งหนึ่ง (ประหยัดประมาณวันละ 500 MB uncompressed หรือ 125 MB compress แล้ว) ลด disk I/O ลงได้มาก
ผมไม่ได้เสนอให้เลิกเก็บ log ใต้ /profile เพราะส่วนนั้นเป็นส่วนที่สมาชิก (หรือแฮ็กเกอร์) สามารถอัพโหลดได้
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 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% (ตามทฤษฎี)
วันที่เข้าพบ ได้ลองปรึกษาทาง ICT ว่า log file ที่มีนั้น สามารถจะเก็บแบบ compress ได้หรือไม่ ซึ่งได้รับคำตอบว่า "ได้" (แต่ไม่มั่นใจหรอกค่ะ จนกว่าจะเห็นประกาศจริงๆ ออกมา)
เรื่อง log นั้น น่าจะถึงคราวที่ว่า ใครมี technic ในการจัดเก็บที่ทั้งสะดวก และทำได้ง่ายๆ น่าจะเผยแพร่ให้ความรู้กับคนอื่นบ้างนะคะ
อนึ่ง ชมรมผู้ประกอบการธุรกิจโฮสติ้ง ก็มีเงื่อนไขฝากไปด้วยอีกประกาศคือ การเก็บ log สำหรับภาพค่ะ นอกจากจะถูกเรียกบ่อย (เช่น ปุ่มที่เป็น image) แล้วยังกินพื้นที่เก็บข้อมูลด้วยสิคะ ยังไม่มีคำตอบจากสวรรค์เลย
compress เป็นการประหยัดพื้นที่ของเราเองครับ
จะ compress หรือไม่ คนร่างประกาศคงไม่สนใจ ประเด็นมันอยู่ที่ว่า "ผู้ให้บริการ" สามารถให้เบาะแสผู้กระทำผิด(ในกรณีที่มีการกระทำผิด)ได้หรือไม่
ใช้ zip rar gzip bzip2 หรืออะไรก็แล้วแต่เราครับ ไม่ใช่เรื่องของคนอื่นเลย! disk ก็ของเรา จะใช้อย่างไรก็เรื่องของเรา แค่มากะเกณฑ์ให้มีภาระเพิ่มโดยไม่ได้คิดจะช่วยเหลืออะไรนี่ก็แย่พออยู่แล้วครับ
มีคำแนะนำหลายอย่างค่ะ เรื่อง log ยกตัวอย่างเช่น
เรื่อง log file ความจริงมีปัญหาอีกครับ คือถ้าจะเอา log file ไปใช้ในศาล จะต้องมีลายมือชื่ออิเล็กทรอนิกส์หรือไม่ (พรบ.ว่าด้วยธุรกรรมทางอิเล็กทรอนิกส์ พ.ศ.2544)
เรื่อง log กลาง เป็นไปไม่ได้เลยครับ ในกรณีที่จะทำอย่างนั้น ไม่ทราบเคยมีใครคำนวณ bandwidth ที่ต้องการใช้ไว้หรือไม่
ใครเป็น "ผู้ให้บริการ" ขึ้นกับประกาศที่จะออกมาตามมาตรา 26 ครับ อย่าคิดเอาเอง อย่าพยายามหาเหตุผลครับ ปวดหัวเปล่าๆ ดังนั้นเขียนอะไรไว้ในประกาศจึงสำคัญมาก
ส่วนเรื่องที่ไม่ได้โหลดภาพใหม่ทุกครั้งเพราะมี cache นั้นก็จริงครับ แต่เกิด log entry ด้วย http status code 304 ไงครับ แม้ไม่ได้โหลดไฟล์ใหม่ แต่ก็เกิด log ไม่ใช่หรือครับ (นอกเสียจาก browser ตัดสินใจไม่เรียกรูปมาเอง -- ซึ่ง browser ที่มีพฤติกรรมเป็นมาตรฐาน จะถาม server เสมอว่ามีรูปนี้อยู่ รูปเปลี่ยนไปหรือไม่ พอ server ตอบว่าไม่เปลี่ยน ก็เกิด log พร้อม status 304 ขึ้นหนึ่งบรรทัด แต่ server ไม่ได้โหลดไฟล์ไปให้)
``ใครเป็น "ผู้ให้บริการ" ขึ้นกับประกาศที่จะออกมาตามมาตรา 26 ครับ อย่าคิดเอาเอง อย่าพยายามหาเหตุผลครับ ปวดหัวเปล่าๆ ดังนั้นเขียนอะไรไว้ในประกาศจึงสำคัญมาก''
ผู้ให้บริการมีกำหนดไว้ใน มาตรา 3 ของ พรบ. แล้วครับ,
\begin{quote}
"ผู้ให้บริการ" หมายความว่า
(๑) ผู้ให้บริการแก่บุคคลอื่นในการเข้าสู่อินเทอร์เน็ต หรือให้สามารถติดต่อถึงกันโดย
ประการอื่น โดยผ่านทางระบบคอมพิวเตอร์ ทั้งนี้ ไม่ว่าจะเป็นการให้บริการในนามของตนเอง หรือ
ในนามหรือเพื่อประโยชน์ของบุคคลอื่น
(๒) ผู้ให้บริการเก็บรักษาข้อมูลคอมพิวเตอร์เพื่อประโยชน์ของบุคคลอื่น
"ผู้ใช้บริการ" หมายความว่า ผู้ใช้บริการของผู้ให้บริการไม่ว่าต้องเสียค่าใช้บริการหรือไม่ก็ตาม
\end{quote}
ส่วน มาตรา 26 แค่เป็นการเลือกจำกัดวงของ "ผู้ให้บริการ" ที่จะเลือกปฏิบัติ ให้แคบลงไปอีก.
เรื่อง cache/log, บางที browser มันไม่ request url เลย
cache มันมี age หรือ อายุ ของมัน
มันไม่ต้อง request ทุกครั้ง, ถ้ายังไม่ expire
ได้ลองกะ firefox 1.0 แล้ว, มันไม่ได้ request เลยจริงๆ ถ้ายังไม่ expire.
ขอบคุณคุณอานนท์มากครับ ที่แก้ไขให้
ขอบคุณคุณป๊อกครับ เรื่อง 304 ผมคิดอย่างนั้นเหมือนกันครับ แต่ว่าเมื่อแก่แล้ว ก็ควรเจียมเนื้อเจียมตัว ไม่ควรซ่ามากนัก (:
เรื่อง expire header น่าสนใจครับ แต่ทำไหวหรือไม่ก็ต้องถามคนทำ คือว่า
ขอบคุณสำหรับคำแนะนำครับ ตอนนี้เราใช้ mod_expires แล้วครับ จะช่วยลด load ของระบบได้อีกทางหนึ่งครับ
แต่ที่จริงแล้วปัญหาของเราคือ Apache ค่อนข้างว่างครับ งานหนักไปอยู่ที่ mongrels ครับ