![logging]()
![logging]()
ในการสร้างระบบงานนั้น สิ่งหนึ่งที่ขาดไปไม่ได้เลยคือ
logging การทำงานต่าง ๆ ของระบบ
ดังนั้นทำให้เกิด code ที่เกี่ยวกับ logging จำนวนมาก
เผลอ ๆ อาจจะมากกว่า code ส่วนอื่น ๆ ของระบบอีกต่างหาก
ซึ่งผมชอบเรียกระบบเหล่านี้ว่า
Logging application !!
ผลที่ตามมาก็คือ
code อุดมไปด้วย log อ่านยากมาก ๆ
code จะทดสอบยากมาก ๆ
บ่อยครั้งไม่สามารถเขียน unit test ได้เลย
code ดูแลยากอีก !!
ดังนั้นนักพัฒนาควรใส่ใจวิธีการจัดการ log มาก ๆ ด้วยนะ
มาดูกันว่าทำอย่างไรได้บ้าง
เริ่มต้นด้วย code สวยงาม clean clean
[gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="1.java"]
แต่เมื่อต้องเพิ่ม logging เข้าไป ก็จะเป็นดังนี้ !!
[gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="2.java"]
ลองคิดดูสิว่า
- ถ้าเขียน unit test ไว้ น่าจะพัง แต่อาจจะแก้ด้วยการดักจับ error แล้วไม่ทำอะไรเลย
- การเขียน log ต้องกระทำกับไฟล์ ซึ่งผ่าน I/O นั่นเอง ไม่น่าจะดีต่อ unit test นะ
- จะลบออกไปก็ไม่ได้ เพราะว่า product manager ต้องการแบบนี้ !!
- จะลบออกก็ไม่ได้เพราะว่า เราต้องการข้อมูลเพื่อ audit และ เป็นข้อมูลในการแก้ไขปัญหา
คำถามที่เกิดขึ้นมาคือ
- เราจะจัดการกับปัญหานี้อย่างไรดี ?
- ต้องการให้ code มัน clean clean !!
- ต้องการให้มีการเขียน log
- ต้องการให้สามารถทดสอบ unit test ได้
มันมีวิธีการหรือเทคนิคอะไรบ้าง ?
- เปิดปิด log ตาม mode/profile ในการ build ซึ่ง code ต้องเปลี่ยนตามไปด้วย ซึ่งขึ้นอยู่กับตัวภาษาที่ใช้อีกด้วย
- นำแนวคิด Dependency Injection มาใช้
- สร้าง Logging สำหรับเรื่องนั้น ๆ ขึ้นมาเลย ทำให้เลือกได้ว่าจะใช้หรือไม่
- นำแนวคิด AOP มาใช้
- สร้าง Library เกี่ยวกับ log มาครอบการทำงานของเราอีกชั้น
มาดูตัวอย่างการใช้งาน Dependency Injection
ซึ่งเราสามารถส่ง object ของ Logger เข้ามาได้เอง
ทำให้ง่ายต่อการทดสอบ
ทำให้ง่ายต่อการเปลี่ยน logger
[gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="3.java"]
หรือทำการสร้างไฟล์ใหม่ที่ extends มาจาก class เดิม
ซึ่งเป็นวิธีการที่แยกการทำงานของแต่ละ class ออกมา
ตามแนวคิด Single Responsibility Principle (SRP)
[gist id="f6bf7d7816e98cb7f9b6f2531751704c" file="4.java"]
โดยรวมแล้วจะใช้วิธีไหนก็ขึ้นอยู่กับความต้องการ
และขึ้นอยู่กับความเหมาะสม
แต่จากที่ใช้มานั้น มักจะใช้หลาย ๆ วิธีเข้าด้วยกัน
เพื่อทำให้ code ดู clean หรือ สะอาด
เพื่อทำให้ code ดูแลรักษาได้ง่าย
ดังนั้นลองกลับไปดู code ที่เราเขียนกันสิว่า
เป็น Logging application หรือไม่ ?