ลด entropy ลดการใช้พลังงาน -> ลดขนาด log


เขียนเป็นแนวคิดที่จะลดขนาดของ 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% (ตามทฤษฎี)

หมายเลขบันทึก: 110670เขียนเมื่อ 11 กรกฎาคม 2007 22:40 น. ()แก้ไขเมื่อ 22 มิถุนายน 2012 10:04 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (16)

วันที่เข้าพบ ได้ลองปรึกษาทาง ICT ว่า log file ที่มีนั้น สามารถจะเก็บแบบ compress ได้หรือไม่ ซึ่งได้รับคำตอบว่า "ได้" (แต่ไม่มั่นใจหรอกค่ะ จนกว่าจะเห็นประกาศจริงๆ ออกมา)

เรื่อง log นั้น น่าจะถึงคราวที่ว่า ใครมี technic ในการจัดเก็บที่ทั้งสะดวก และทำได้ง่ายๆ น่าจะเผยแพร่ให้ความรู้กับคนอื่นบ้างนะคะ 

อนึ่ง ชมรมผู้ประกอบการธุรกิจโฮสติ้ง ก็มีเงื่อนไขฝากไปด้วยอีกประกาศคือ การเก็บ log สำหรับภาพค่ะ นอกจากจะถูกเรียกบ่อย (เช่น ปุ่มที่เป็น image) แล้วยังกินพื้นที่เก็บข้อมูลด้วยสิคะ ยังไม่มีคำตอบจากสวรรค์เลย

P conductor
เข้ามาเยี่ยม....
เจริญพร
P แบบนี้จะส่งผลให้เว็บไทยมีภาพน้อยๆ หรือเปล่าครับ? ดีเหมือนกันมั้ง จะได้โหลดไวๆ :-)

จะเก็บแบบ compress หรือไม่ compress เขาจะมายุ่งทำไมเหรอครับ? หรือว่าผมเข้าใจคำว่า compress ผิด? ในที่นี้หมายถึงใช้พวก gzip ไปบีบอัดไฟล์ log เปล่าครับ?
เปลี่ยนมาตั้งชื่อ url สั้นๆ มันจะช่วยได้เปล่าครับ image ก็เหลือ m ตัวเดียวพอ gotoknow ก็เหลือ g พอ :-P

แต่ว่าถ้าสั่ง compress ทุกวันเลยก็ได้ หาช่วง traffic ต่ำๆ เขียน cron ไว้ ก็น่าจะได้ 1 GB ไม่น่านาน? หรือว่าทำอยู่แล้ว?

compress เป็นการประหยัดพื้นที่ของเราเองครับ

จะ compress หรือไม่ คนร่างประกาศคงไม่สนใจ ประเด็นมันอยู่ที่ว่า "ผู้ให้บริการ" สามารถให้เบาะแสผู้กระทำผิด(ในกรณีที่มีการกระทำผิด)ได้หรือไม่

ใช้ zip rar gzip bzip2 หรืออะไรก็แล้วแต่เราครับ ไม่ใช่เรื่องของคนอื่นเลย! disk ก็ของเรา จะใช้อย่างไรก็เรื่องของเรา แค่มากะเกณฑ์ให้มีภาระเพิ่มโดยไม่ได้คิดจะช่วยเหลืออะไรนี่ก็แย่พออยู่แล้วครับ

P นั่นซิครับก็งงๆ ว่าทำไมถึงเป็นเด็น -_-!  ถ้าบังคับไม่ให้ compress สงสัยคงต้องประกาศด้วยว่า ห้ามใช้ harddisk IDE ราคาถูกมาเก็บ log. 

มีคำแนะนำหลายอย่างค่ะ เรื่อง log ยกตัวอย่างเช่น

  • print เป็นกระดาษออกมา แล้วเซ็นชื่อกำกับ (ถ้าจริง ดิฉันจะออกไปขายกระดาษกะหมึกพิมพ์แทน)
  • ให้หา log farm เป็น log กลาง แล้วก็ให้โยน file ไปไว้นั่น
  • ให้เขียนเป็นแผ่น cd ออกมา
  • ให้เก็บนอกเครื่อง ห้ามเก็บในเครื่องเดียวกับเครื่องที่ใช้งาน
ประมาณว่า กระอักกระอ่วนค่ะ 
เพื่อนผมบอกว่าอย่างนี้ครับ

- มันไม่ได้ load image ใหม่ทุกหน้านิ
- มันมี cache
- browser มันมี cache
- css, js ด้วย
- อีกอย่างแค่ เปิด เว็บ ไม่ต้องเก็บไม่ใช่เหรอ.
- ที่ต้องเก็บน่าจะเป็น action ของการ post/upload ข้อมูลมากกว่า.
- พวกให้บริการที่เป็นแบบอ่านอย่างเดียว, รู้สึกจะไม่ใช่เป็น "ผู้ให้บริการ" ตามนิยามของ พรบ. นะ.
- ต้องเป็นผู้เก็บรักษาข้อมูล ถึงจะเป็น "ผู้ให้บริการ" ตาม พรบ.
- ผู้ให้บริการเก็บบรักษาข้อมูลแทนผู้อื่น.
- ถ้าไม่มีการ upload/post ก็ไม่ต้อง log
P ให้ print สงสัย green peace ต้องมาประท้วง? ป่าวอด -_-! เขียน cd นี่ผมว่า cd ความน่าเชื่อได้มันน้อยกว่า harddisk อีก. (ความเชื่อนะครับ ไม่แน่ใจว่าจริงหรือเปล่า).  

ทำหลายๆ ชุดมันก็ลดความเสี่่ยงทั้งนั้น แต่มันเปลืองอะครับ.  จะหาได้อย่างไรว่าจุดที่พอดีแค่ไหน.  อย่างไรก็ตามวิธีที่เปลืองด้วย เสี่ยงด้วยก็น่าจะตัดออกไปได้?

เรื่อง 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.

ขอบคุณคุณอานนท์มากครับ ที่แก้ไขให้

ประเด็นเรื่อง cache
จากที่ตรวจดูใน firefox ของผม 
1. รูป, css, js ทั้งหมดใน gotoknow ไม่มี expire header ส่งกลับมาเลย, ทำให้ browser ต้องใช้ข้อมูล Last-Modified ในการตัดสินใจเรื่อง cache,
การ access ครั้งถัดไปก็เลยส่ง request ไป check last modified (ผลก็คือ server ตอบ 304)

แต่ถ้ามีการ set expire header กลับมาด้วย, 
browser จะใช้ข้อมูลนั้นในการตัดสินใจ request
(ใน apache มี mod_expire ให้ใช้ครับ)

Note: google ตั้ง expire ของ logo เขาไว้ที่ปี 2038
,blognone ตั้ง expire ไว้ 2 อาทิตย์
บันทึกนี้ แต่ละ comment เนื้อหาเยอะจริงๆ ... เจ๋ง!!!

ขอบคุณคุณป๊อกครับ เรื่อง 304 ผมคิดอย่างนั้นเหมือนกันครับ แต่ว่าเมื่อแก่แล้ว ก็ควรเจียมเนื้อเจียมตัว ไม่ควรซ่ามากนัก (:

เรื่อง expire header น่าสนใจครับ แต่ทำไหวหรือไม่ก็ต้องถามคนทำ คือว่า

  1. mod_expire ไม่สามารถเลือก set expiry date ตาม location ได้ (ต้องเหมารวมกันไปตามนามสกุลของไฟล์ -- ซึ่งอาจจะดีหรือไม่ดีสำหรับผู้ใช้ก็ได้ เพราะ GotoKnow มีทั้งไอคอนของตนเอง และมีภาพที่ผู้ใช้อัพโหลดขึ้นมาด้วย)
  2. หากเลี่ยงไปใช้ .htaccess เพื่อ override expiry date ตาม location ของไฟล์ ก็เพื่มความเสี่ยงของ .htaccess (แก้ไขได้)
  3. จะเริ่มแยก GotoKnow (site) ออกจาก KnowledgeVolution (software) ได้ยากขึ้นครับ จะมี dependency มากขึ้น ซึ่ง KM ไซต์ที่ใช้ KnowledgeVolution อาจจะไม่มีทรัพยากรพอ
ทั้งหมดที่คุณป๊อกแนะนำมา ผมคิดว่าน่าลองครับ เพียงแต่ว่าได้แต่คิดเพราะผมไม่ได้เป็นคนทำ :)

ขอบคุณสำหรับคำแนะนำครับ ตอนนี้เราใช้ mod_expires แล้วครับ จะช่วยลด load ของระบบได้อีกทางหนึ่งครับ

แต่ที่จริงแล้วปัญหาของเราคือ Apache ค่อนข้างว่างครับ งานหนักไปอยู่ที่ mongrels ครับ

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท