การดู : 0

12/04/2026 18:16น.

Ep.24 Go กับ Error Handling & Logging บน WebSocket - เพิ่มความมั่นคงให้ระบบของคุณ!

Ep.24 Go กับ Error Handling & Logging บน WebSocket - เพิ่มความมั่นคงให้ระบบของคุณ!

#Go

#Golang

#ภาษา Go

#WebSocket

#Error Handling

#Logging

#ความมั่นคงของระบบ

#การจัดการข้อผิดพลาด

#การบันทึกข้อมูล

#การศึกษาการเขียนโปรแกรม

#การพัฒนาโปรแกรม

#การเขียนโปรแกรม

#การเขียนโปรแกรม Go

#การเขียนโปรแกรมสำหรับมือใหม่

#ฝึกเขียนโปรแกรม

#ภาษาโปรแกรม

#โปรแกรม

#โปรแกรมเมอร์

#Superdev School

Go กับ Error Handling & Logging บน WebSocket - เพิ่มความมั่นคงให้ระบบของคุณ!

 

ทำไมต้องจัดการ Error และ Logging บน WebSocket?

WebSocket เป็นโปรโตคอลที่ทำงานแบบเรียลไทม์ หากเกิดข้อผิดพลาด (Error) หรือการตัดการเชื่อมต่อ (Disconnection) อาจส่งผลต่อประสบการณ์ของผู้ใช้ การมีระบบจัดการ Error และ Logging จะช่วย :

  • ตรวจสอบเหตุการณ์ผิดปกติ เช่น การเชื่อมต่อขาดหรือข้อความไม่ถูกต้อง
  • ดีบักปัญหาได้รวดเร็ว โดยดูข้อมูลใน Log
  • เพิ่มความมั่นคงของระบบ ด้วยการจัดการ Error แบบอัตโนมัติ

 

วิธีจัดการ Error บน WebSocket

1. ตรวจสอบข้อผิดพลาดระหว่างการเชื่อมต่อ

ทุกครั้งที่มีการสร้างการเชื่อมต่อ WebSocket เราควรตรวจสอบ Error เพื่อให้แน่ใจว่าการเชื่อมต่อสำเร็จ

ในตัวอย่างนี้ :

หากเกิดข้อผิดพลาด จะส่งข้อความ HTTP Error กลับไปยังผู้ใช้ และบันทึก Error ลงใน Log

ตัวอย่าง :

conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
    log.Println("Failed to upgrade connection:", err)
    http.Error(w, "Could not open WebSocket connection", http.StatusBadRequest)
    return
}

 

2. จัดการ Error ขณะรับและส่งข้อความ

Error อาจเกิดขึ้นได้เมื่อไคลเอนต์ปิดการเชื่อมต่อ หรือส่งข้อความในรูปแบบที่ไม่ถูกต้อง

ในตัวอย่างนี้ :

ใช้ break เพื่อตัดการเชื่อมต่อเมื่อเกิดข้อผิดพลาด

for {
    _, msg, err := conn.ReadMessage()
    if err != nil {
        log.Println("Error reading message:", err)
        break // ปิดการเชื่อมต่อเมื่อเกิด Error
    }

    if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
        log.Println("Error writing message:", err)
        break
    }
}

 

3. ตรวจจับการตัดการเชื่อมต่อ

เมื่อไคลเอนต์ปิดการเชื่อมต่อ เราสามารถตรวจจับ Error และดำเนินการลบการเชื่อมต่อออกจากระบบได้

ตัวอย่าง :

if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
    log.Printf("Unexpected close error: %v", err)
}

 

การบันทึก Log เพื่อการตรวจสอบ

1. บันทึกเหตุการณ์สำคัญ

เราสามารถใช้ log.Println เพื่อบันทึกเหตุการณ์ เช่น การเชื่อมต่อใหม่ การตัดการเชื่อมต่อ และข้อความที่ส่งระหว่างเซิร์ฟเวอร์และไคลเอนต์

ตัวอย่าง :

log.Println("New client connected")
defer log.Println("Client disconnected")

 

2. บันทึก Log ลงไฟล์

แทนที่จะพิมพ์ Log ลงหน้าจอ เราสามารถบันทึก Log ลงไฟล์เพื่อการตรวจสอบย้อนหลัง

ตัวอย่าง :

file, err := os.OpenFile("websocket.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
    log.Fatal(err)
}
defer file.Close()

log.SetOutput(file) // บันทึก Log ลงไฟล์
log.Println("WebSocket server started")

 

ตัวอย่างการจัดการ Error และ Logging บน WebSocket

ในตัวอย่างนี้ :

บันทึก Log ทุกเหตุการณ์สำคัญลงไฟล์ websocket.log

ตรวจสอบและจัดการ Error ทั้งในขั้นตอนการเชื่อมต่อและระหว่างการส่งข้อความ

package main

import (
    "log"
    "net/http"
    "os"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Error upgrading connection:", err)
        return
    }
    defer conn.Close()

    log.Println("New client connected")

    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
                log.Printf("Unexpected close error: %v", err)
            }
            log.Println("Connection closed")
            break
        }

        log.Printf("Received message: %s", msg)

        if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
            log.Println("Error writing message:", err)
            break
        }
    }
}

func main() {
    file, err := os.OpenFile("websocket.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    log.SetOutput(file)

    http.HandleFunc("/ws", handleConnections)
    log.Println("WebSocket server started at :8080/ws")
    http.ListenAndServe(":8080", nil)
}

 

สรุปง่ายๆ

  • ใช้ log.Println เพื่อบันทึกเหตุการณ์สำคัญ
  • ตรวจสอบและจัดการ Error ในทุกขั้นตอนของ WebSocket
  • บันทึก Log ลงไฟล์เพื่อการตรวจสอบย้อนหลัง
  • ใช้ websocket.IsUnexpectedCloseError เพื่อตรวจจับการตัดการเชื่อมต่อที่ไม่ปกติ