ป้ายกำกับ: สาระความรู้

Shell Script: ดูแนวทางการทำ Structured Logging (JSON Logs) บน Shell ScriptShell Script: ดูแนวทางการทำ Structured Logging (JSON Logs) บน Shell Script

ในโลกของการพัฒนาระบบอัตโนมัติและการดูแลระบบโครงสร้างพื้นฐาน ข้อมูลบันทึกการทำงาน (Log) ถือเป็นหัวใจสำคัญในการตรวจสอบและแก้ไขปัญหา เมื่อก่อนหน้านี้ การทำ Logging มักจะเป็นเพียงข้อความ plain text ที่เรียงต่อกัน ทำให้เมื่อปริมาณ Log มีขนาดใหญ่ หรือมีเหตุการณ์ที่ซับซ้อน หลายฝ่ายต้องใช้เวลาอย่างมากในการค้นหาข้อมูลเฉพาะเจาะจง อย่างไรก็ตาม ในยุคสมัยของ Microservices และ DevOps นั้น ความสามารถในการประมวลผล Logs โดยเครื่องจักรโดยตรงจึงมีความจำเป็นสูงสุด

Understanding Structured JSON Logging

Structured Logging คือแนวคิดที่เปลี่ยนจากการเขียน log เป็นแค่ชุดคำพูด ให้กลายเป็นรูปแบบที่มีไวยากรณ์ชัดเจน เช่น โครงสร้าง Key-Value Pair ซึ่งภาษา JavaScript Object Notation (JSON) ได้รับเลือกให้มาเป็นมาตรฐานหลักสำหรับการจัดเก็บประเภทนี้ แทนที่จะพิมพ์ว่า “เกิด Error: ไฟล์ไม่พบ” เราจะแปลงมันให้อยู่ในรูป {"level": "ERROR", "component": "FileHandler", "message": "Resource not found"} รูปแบบเช่นนี้นอกจากจะช่วยเพิ่มประสิทธิภาพในการอ่านค่าด้วยโปรแกรม Parser ต่างๆ แล้ว ยังทำให้ระบบ Monitoring Tools สามารถ Index, Filter, และ Alert บนฟิลด์ใดก็ได้ได้อย่างแม่นยำ

The Challenge of Serialization in Shell Scripting

สำหรับผู้เชี่ยวชาญด้าน System Administration ที่ทำงานกับ Bash Scripts การจัดการโครงสร้าง بياناتระดับสูงเพื่อใส่ลง Log File ถือว่าเป็นความท้าทายอย่างหนึ่ง เพราะตัว Shell เองถูกออกแบบมาเพื่อการดำเนินการ Command Line ไม่ใช่การ Handle Data Structure Complex อย่าง Dictionary หรือ Array ดังนั้น แนวทางที่ดีที่สุดคือการใช้เครื่องมือภายนอกเข้ามาช่วยเหลือ โดยเฉพาะยูทิลิตี้บรรทัดคำสั่งยอดนิยมอย่าง jq เพื่อทำหน้าที่ Serialize ข้อมูลที่เราต้องการบันทึก ให้กลายเป็น JSON String ที่ถูกต้องตามไวยากรณ์

  • Step 1: Define Variables ใช้ตัวแปรมาตรฐานของ Shell ($variable_name) ในการเก็บข้อมูลแต่ละส่วน เช่น ชื่อ Process ID ระดับ Severity หรือ Module Name
  • Step 2: Construct the Payload แทนที่จะพิมพ์ข้อความเป็นก้อนเดียว เราจะรวบรวม Key และ Value ต่างๆ เข้าด้วยกันในรูปแบบที่พร้อมสำหรับการส่งผ่านให้ jq ประมวลผล
  • Step 3: Execute Serialization with JQ นำโครงสร้าง Variable ทั้งหมดไปป้อนเข้าสู่ Pipe ของ jq -n --arg key value='{key: