Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan konteks untuk melaksanakan kawalan penapisan log permintaan dalam Go

Cara menggunakan konteks untuk melaksanakan kawalan penapisan log permintaan dalam Go

WBOY
WBOYasal
2023-07-22 22:09:361508semak imbas

Cara menggunakan konteks untuk melaksanakan kawalan penapisan log permintaan dalam Go

Pengenalan:
Dalam aplikasi web yang besar, log adalah sangat penting untuk membantu kami memahami status berjalan aplikasi, dan juga digunakan untuk menyelesaikan masalah dan pemantauan. asas penting. Walau bagaimanapun, untuk sesetengah aplikasi besar, jumlah log mungkin sangat besar Jika log direkodkan untuk setiap permintaan, fail log akan menjadi sangat besar dan sukar untuk mengesan maklumat yang ingin kami lihat. Oleh itu, artikel ini akan memperkenalkan cara menggunakan pakej konteks Go untuk melaksanakan kawalan penapisan log permintaan untuk mengurangkan lebihan log dan meningkatkan kebolehbacaan log.

1. Apakah konteks
Sebelum kita mula, mari kita fahami pakej konteks dalam bahasa Go. Konteks ialah perpustakaan standard yang disediakan oleh bahasa Go, yang digunakan untuk memindahkan data berkaitan permintaan Ia digunakan terutamanya untuk pemindahan konteks merentas permintaan Goroutine. Dalam permintaan, konteks boleh digunakan untuk menghantar maklumat berkaitan permintaan, seperti pengesahan pengguna, ID yang diminta, dsb. Dalam bahasa Go, menggunakan konteks boleh mengelakkan masalah menghantar konteks dalam timbunan panggilan fungsi.

2. Gunakan konteks untuk melaksanakan penapisan log permintaan
Dalam aplikasi web, permintaan akan melalui berbilang fungsi middleware dan pemprosesan, dan setiap fungsi middleware dan pemprosesan mungkin merekodkan log berkaitan permintaan. Untuk melaksanakan kawalan penapisan, kami boleh menambah bit bendera dalam permintaan untuk menentukan sama ada pengelogan perlu direkodkan. Berikut ialah contoh mudah:

package main

import (
    "fmt"
    "log"
    "net/http"
    "context"
)

type key int

const (
    loggerKey key = iota
)

func main() {
    http.HandleFunc("/", withLogging(handleRequest))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func withLogging(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        logger := log.New(w, "", log.LstdFlags)
        ctx := context.WithValue(r.Context(), loggerKey, logger)
        next(w, r.WithContext(ctx))
    }
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
    logger := r.Context().Value(loggerKey).(*log.Logger)
    logger.Printf("Received request from %s", r.RemoteAddr)
    fmt.Fprintf(w, "Hello, World!
")
}

Dalam contoh di atas, kami menggunakan fungsi WithValue dalam konteks untuk menyimpan logger objek output log sebagai nilai dalam konteks permintaan. Dalam perisian tengah withLogging, kami mencipta objek logger dan menetapkannya kepada konteks permintaan. Dalam fungsi pemprosesan handleRequest, kami memperoleh objek logger daripada konteks permintaan melalui kaedah Nilai konteks dan menggunakan objek ini untuk merekodkan log.

3. Laksanakan penapisan log
Untuk melaksanakan penapisan log, kami boleh mendapatkan URL atau maklumat lain dalam permintaan dalam perisian tengah withLogging, dan menggunakan maklumat ini untuk menentukan sama ada log perlu direkodkan. Berikut ialah contoh mudah di mana kami hanya merekodkan log permintaan untuk mengakses laluan tertentu:

func withLogging(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        logger := log.New(w, "", log.LstdFlags)
        
        // 检查请求是否需要记录日志
        if shouldLog(r) {
            ctx := context.WithValue(r.Context(), loggerKey, logger)
            next(w, r.WithContext(ctx))
        } else {
            next(w, r)
        }
    }
}

func shouldLog(r *http.Request) bool {
    if r.URL.Path == "/logs" {
        return true
    }
    return false
}

Dalam contoh di atas, kami menentukan fungsi shouldLog untuk menentukan sama ada permintaan itu perlu dilog. Jika URL yang diminta ialah /logs, maka kembalikan benar, menunjukkan bahawa pengelogan diperlukan jika tidak, kembalikan palsu, menunjukkan bahawa pengelogan tidak diperlukan. Dalam perisian tengah withLogging, kami mula-mula menyemak sama ada permintaan itu perlu dilog, dan jika ya, teruskan pemprosesan Jika tidak, kami terus memanggil fungsi seterusnya.

4. Ringkasan
Artikel ini memperkenalkan cara menggunakan pakej konteks Go untuk melaksanakan kawalan penapisan log permintaan. Dengan menambahkan bit bendera pada setiap permintaan dan menilai nilai bit bendera dalam middleware untuk memutuskan sama ada untuk merekodkan log, lebihan log boleh dikurangkan dengan berkesan dan kebolehbacaan log boleh dipertingkatkan. Saya harap artikel ini dapat membantu anda melaksanakan kawalan penapisan log dalam Go.

Rujukan:
https://golang.org/pkg/context/
https://blog.golang.org/context
https://www.alexedwards.net/blog/working-with-go-via - permintaan-konteks

Atas ialah kandungan terperinci Cara menggunakan konteks untuk melaksanakan kawalan penapisan log permintaan dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn