ข้ามไปยังเนื้อหาหลัก
ProgrammerThailand

ไอเดีย (Idea) idea devops logging

ไอเดีย #69: ระบบรวม log และค้นหา (log viewer เล็ก ๆ)

ตี 2 ระบบลูกค้า error ต้อง SSH เข้าเซิร์ฟเวอร์ทีละเครื่อง แล้ว grep ไฟล์ log ที่ใหญ่หลาย GB ใครเคยเจอคงรู้ว่ามันเหนื่อยแค่ไหน เครื่องมือรวม log ระดับองค์กรใหญ่ก็หนักเกินไปสำหรับทีมสามสี่คนที่มีเซิร์ฟเวอร์ไม่กี่เครื่อง ไอเดียนี้คือ log viewer เล็ก ๆ ที่รับ log จากหลายแอปมารวมไว้ที่เดียว ค้นหาได้เร็ว และเตือนเมื่อ error พุ่ง

ใครจะใช้

  • นักพัฒนา — ค้น log ตาม request id, ผู้ใช้, ช่วงเวลา, ระดับความรุนแรง
  • ทีม support — ดู error ของลูกค้ารายที่แจ้งปัญหาเข้ามา (เห็นเฉพาะฟิลด์ที่อนุญาต)
  • หัวหน้าทีม — ตั้งกฎแจ้งเตือน ดูแนวโน้ม error

ฟีเจอร์ขั้นต่ำ (MVP)

  • Ingest API รับ log แบบ JSON เป็น batch ผ่าน HTTP พร้อม API key ต่อแอป
  • ตัวส่ง log ง่าย ๆ เช่น log target ของ Yii2/Laravel หรือสคริปต์ tail ไฟล์แล้วส่ง
  • หน้าค้นหา: full-text, กรองตาม app, level, ช่วงเวลา และฟิลด์ใน context
  • Live tail ดู log ที่เข้ามาแบบเรียลไทม์
  • จัดกลุ่ม error ที่ข้อความเหมือนกัน แสดงจำนวนครั้งและครั้งล่าสุด
  • กฎแจ้งเตือน เช่น error ของแอป X เกิน N ครั้งใน 5 นาที → แจ้ง LINE หรือแชตของทีม
  • นโยบายเก็บ log (retention) ลบอัตโนมัติเมื่อเกินจำนวนวันที่กำหนด

ต่อยอดได้อีก

  • บันทึก query ที่ใช้บ่อยเป็น saved search
  • กราฟจำนวน log ตามเวลาแยก level
  • เชื่อมกับ trace id เพื่อตามหนึ่ง request ข้ามหลาย service
  • รับ log ผ่าน syslog สำหรับอุปกรณ์เครือข่าย

โครงข้อมูลตั้งต้น

CREATE TABLE log_entry (
  id BIGSERIAL,
  app_id INT NOT NULL,
  ts TIMESTAMPTZ NOT NULL,
  level VARCHAR(10) NOT NULL,
  message TEXT,
  context JSONB,
  fingerprint CHAR(40)
) PARTITION BY RANGE (ts);

CREATE INDEX ON log_entry USING GIN (context);

ตารางอื่น: app (ชื่อ, api_key_hash, retention_days), error_group (fingerprint, first_seen, last_seen, count), alert_rule, alert_event ถ้าข้อมูลเยอะมากค่อยพิจารณาฐานข้อมูลแบบ columnar ทีหลัง

ระดับความยาก และสิ่งที่จะได้เรียนรู้

ท้าทาย — โจทย์จริงคือปริมาณข้อมูล

  • ออกแบบ ingest ที่รับข้อมูลเร็ว ใช้ queue และ bulk insert
  • partition ตามวันและ drop partition เก่าแทนการ DELETE
  • full-text search และ index บน JSONB
  • ทำ live tail ด้วย WebSocket หรือ Server-Sent Events

ข้อควรระวัง

  • log มักมีข้อมูลส่วนบุคคลหรือ secret หลุดมา (password, token, เลขบัตร) ควรมีตัวกรอง mask ตั้งแต่ฝั่งส่ง และระวังเรื่อง PDPA
  • จำกัดสิทธิ์ว่าใครเห็น log แอปไหนได้ และเก็บ log ว่าใครค้นอะไร
  • ถ้า log server ล่ม แอปหลักต้องไม่ล่มตาม ฝั่งส่งควรเป็น async และทิ้งข้อมูลได้เมื่อจำเป็น

ทีมของคุณตอนนี้ดู log กันแบบไหนครับ SSH แล้ว grep หรือมีเครื่องมือแล้ว? และคิดว่า PostgreSQL เพียงพอสำหรับงาน log ขนาดทีมเล็ก หรือควรเริ่มด้วยฐานข้อมูลแบบอื่นตั้งแต่แรก มาถกกันครับ ใครทำแล้วเอามาแชร์ในกระทู้ได้เลย

0 คะแนน

0 คำตอบ

ยังไม่มีคำตอบ

รู้คำตอบ? ช่วยแบ่งปันได้เลย

ตอบคำถามนี้

เข้าสู่ระบบเพื่อตอบคำถามและโหวต

เข้าสู่ระบบ สมัครสมาชิก