Exp: Logging Severely Affects — Performance
จากการอ่าน log และเขียน log แล้วทำไมต้อง log ? สำหรับผมมันเริ่มต้้นจากต้องการกลับมาดูอะไรซ้ำ และlog ควรบ่งบอกพฤติกรรมของ application ยังคงทำงานปกติ ครั้งนี้มาแชร์สิ่งที่ผมทำอย่างไรที่จะเราสามารถที่จะช่วยตรวจสอบผ่าน log ได้เร็วขึ้น
อย่างแรกก่อนคือแบ่งประเภทของ Log ที่จะใช้อยู่เป็นประจำ
มีอยู่ 4 ประเภท (มีประเภทอื่นอีก แต่ก็ไม่ใช้งานเลย)
DEBUG — ผมมักจะใช้บน Environment DEV อยู่บ่อยๆ เพื่อ Debug Application แต่หลังจากนั้นก็จะไม่เก็บไว้
INFO — เป็นประเภทที่สำคัญที่ถูกใช้จริงตอนเก็บ log ไว้จริง
WARN — ไม่ค่อยได้ใช้บ่อยนัก ผมก็มักจะใช้ประเภทนี้ตอนที่ต้องการจะบอกเป็น Message ไว้ใน application เท่านั้้
ERROR — เป็นประเภทที่สำคัญอีกตัว เมื่อเราหา log ด้วย error จะพบเจอเสมอว่าเหตุของ error เป็นเพราะอะไร
Loogging Affects Performance
การทำ logging จำนวนมาก แน่นอนว่ามันส่งผลเกิดการใช้ I/O ต่อ Server ทีนี้ก็เลยทำให้เราตระหนักประเภทและ message ที่ logging นั้นสำคัญ
- Log ที่เราใส่มี information เยอะเกินไป แน่นอนว่ามันส่งผลเกิดการใช้ I/O ต่อ Server ทีนี้ก็เลยทำให้เราตระหนักประเภทและ message ที่ logging นั้นสำคัญ และยังทำให้เราระบุหาสาเหตุเมื่อเกิดปัญหาได้ยาก เพราะบางทีพบว่า log ใส่ข้อมูลไปเยอะแยะ แต่ใน log ชุดนั้น ไม่ได้มีอะไรอยู่เลย
- Format of logging จะต้องมี Timestamp, Thread Name, Class/Function Name
Q:ทำไมต้องมี Timestamp
A:ทำให้รู้ว่าสิ่งที่เกิดขึ้นเมื่อไหร่
Q:ทำไมต้องมี Thread Name
A:อ่าน log ไม่รู้เรื่องเลยถ้า Application รองรับการทำงานแบบ multiple thread
Q:ทำไมต้องมี Class/Function Name
A:เราจะรู้พฤติกรรมของ app ผ่านได้ผ่าน Class/Function Name - การเลือก Format of logging นั้นสำคัญก็จริง แต่เราต้องใช้เวลาสักระยะเพื่อมาทบทวนว่า สิ่งที่เราต้องการ logging นั้นต้องสอดคล้องกัน สุดท้ายแล้วเราต้องการ format ที่เหมาะสมมากว่าเป็นมาตรฐานแล้วไม่ได้ช่วยอะไร ช่วยให้เราเห็นภาพรวมพฤติกรรมของ Application
- ภาษาใน Message ผมเลือกใช้แบบ Simple English ซึ่งอ่านแล้ว Make Sense และก็อ่านเข้าใจง่าย ส่งต่อ Team Support ช่วย Monitor Application ก็ใช้เวลาไม่นาน
- บางอย่างที่เป็นข้อมูล Sensitive ไม่ต้องใส่ลงไปใน Message อย่างเช่น Password, Credit card numbers, Phone Number, Personal Identify Number, National Identify Number, Passport Identify Number
- log all important information that is necessary to debug or troubleshoot a problem if it happens.
- เลือก logging ที่ช่วยสามารถแก้ปัญหาให้ได้เมื่อมันเกิดขึ้นจริงๆ ตัวอย่างที่ message ที่เกิดขึ้นจริง “failed to convert String to date” แต่เรามีทั้ง Start Date, End Date, Create Date, Update Date แล้วอันไหนที่เราผิดหล่ะ ซึ่งควรปรับแก้เป็น “invalid startDate : {startDate}” จะช่วยให้เราย้อนกลับมาแก้ได้ตรงจุด
- เมื่อทำบางอย่างไม่สำเร็จเลยไปเอาค่า Default Setting ขึ้นมาใช้งาน ในมุมของ Application จะมีการทำงานแบบนี้เกิดขึ้น และสิ่งนี้ก็จำเป็นที่จะต้อง logging ไว้เหมือนกัน “Not able to load port settings, default Setting selected for port : {port}”