Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

สรุปการใช้งาน Structured Log ของ Go กัน

$
0
0

ก่อนหน้านี้ Go 1.21 ออกมานั้น มี Structured log package (log/slog) ออกมาให้ใช้งาน
ซึ่งเคยอธิบายการใช้งานเบื้องต้นไว้ที่นี่
แต่ว่าต้องไปแบ่งปันเรื่อง logging สำหรับระบบที่พัฒนาด้วย Go
จึงทำการอธิบายแบบละเอียดขึ้นไว้หน่อย
มาเริ่มกันเลย

เริ่มจากปัญหาและข้อจำกัดของ log package กันก่อน

  • ปัญหาของ log level ใน go นั้นทำการจัดการเหมือนกันเลย ทำให้ยากต่อการแบ่ง หรือ กรองเอาบาง level
  • ไม่สนับสนุน context ทำให้ยากต่อการเพิ่มข้อมูลต่าง ๆ ลงไปใน log
  • ไม่สามารถจัดการเรื่อง log sampling ได้ นั่นคือจะเก็บ log ทุกอย่าง
  • สามารถ configuration ได้น้อย ทำให้ใช้งานจริง ๆ ไม่ได้
  • ไม่สนับสนุน structured log message ใช้ได้แค่ plain text เท่านั้น ต้องไปใช้ 3-party package นั่นเอง

ปัญหาต่าง ๆ ทำให้ log package ที่เป็น 3-party package ออกมามากมาย เช่น

  • logrus
  • zap

ดังนั้นใน Go 1.21 ได้เพิ่ม log/slog package เข้ามา

ซึ่งเขียนโครงสร้างของ package ออกมาคร่าว ๆ ได้ประมาณนี้

สิ่งที่จะเห็นได้ชัดคือ ใน Logger นั้นจะมี function ต่าง ๆ ให้ใช้งานตาม log level
รวมทั้งการส่งค่าต่าง ๆ เข้าไปได้ เช่น handler เป็นต้น
อีกอย่าง แต่ละ log level จะไม่มีการเรียกใช้งาน panic() หรือ exit() เหมือนกับ log package

การใช้งานแบบง่าย ๆ

[gist id="a9822fb8da96d927354a1532230ff1ca" file="1.go"]

ทำการเพิ่ม JSONHandler เข้ามาใน Logger

[gist id="a9822fb8da96d927354a1532230ff1ca" file="2.go"]

เราสามารถทำการ custom handler ผ่าน HandlerOptions ได้
สามารถกำหนดค่าต่าง ๆ ได้ เช่น log level และ attribute replace เป็นต้น

ใน log message นั้น สามารถเพิ่ม attribute และ nested key เข้าไปได้

ใช้งานผ่าน struct Attr ซึ่งมี type ต่าง ๆ ให้เลือกใช้งานมากมาย
หรือทำเป็น group ก็ได้

[gist id="a9822fb8da96d927354a1532230ff1ca" file="3.go"]

ทำการ custom log level ผ่าน interface Leveler

[gist id="a9822fb8da96d927354a1532230ff1ca" file="4.go"]

แน่นอนในส่วนของ Handler ก็ custom ได้ ผ่าน interface Handler

โดย default จะมีเพียง 2 handler คือ Text และ JSON เท่านั้น
ดังนั้นในการใช้งานอาจจะต้อง custom อีกแน่นอน

[gist id="a9822fb8da96d927354a1532230ff1ca" file="5.go"]

ใน log message อาจจะมี sensitive data ดังนั้นใน slog ก็สามารถซ่อนได้

จะทำการซ่อนไม่ให้แสดงใน log ผ่าน interface LogValuer
ยกตัวอย่าง จะแสดงเพียง id ของ User เท่านั้น

[gist id="a9822fb8da96d927354a1532230ff1ca" file="6.go"]

ใช้งาน slog ร่วมกับ web framework ต่าง ๆ ได้

มีคนทำ middleware ให้ลองนำไปใช้งานกันด้วย
เช่น slog: Echo middleware

หรือจะเป็น 3-party log package ต่าง ๆ ก็ใช้งาน slog เป็น backend ของตนเอง
ทำให้สามารถทำงานได้เป็นปกติ เช่น

ดูรายละเอียดเพิ่มเติมได้ที slog package

ขอให้สนุกกับการ coding ครับ

Reference Websites


Viewing all articles
Browse latest Browse all 1997

Trending Articles