Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melepasi struktur dalam slog logger dan menggunakan medannya secara automatik?

Bagaimana untuk melepasi struktur dalam slog logger dan menggunakan medannya secara automatik?

WBOY
WBOYke hadapan
2024-02-06 08:10:03431semak imbas

如何在 slog 记录器中传递结构并自动使用其字段?

Kandungan soalan

Saya menggunakan pakej slog. Masalah yang saya hadapi ialah apabila saya mempunyai kebanyakan parameter dalam struct, saya perlu menghantar terlalu banyak parameter kepadanya.

Adakah cara untuk mengubah suai pengendali untuk menggunakan struktur ini? Sama seperti apa yang anda boleh lakukan dalam python, hantar kamus atau objek sebagai kandungan tambahan dan kemudian ekstrak parameter yang diperlukan daripadanya.

Sekarang saya ada ini:

g.l.Log(
    context.TODO(),
    slog.LevelInfo,
    "Sending request to server.",
    "Destination", m.route.destination,
    "Protocol", m.route.protocol,
    "Service Identifier", m.route.serID,
    "Session ID", m.GetIdentifier(),
    "Client Connection", client.RemoteAddr().String(),
    "Server Connection", destination.RemoteAddr().String(),
)

Saya nak buat macam ni:

g.l.Log(
    context.TODO(),
    slog.LevelInfo,
    "Sending request to server.",
    "message", m,
    "Client Connection", client.RemoteAddr().String(),
    "Server Connection", destination.RemoteAddr().String(),
)

Apa yang perlu saya lakukan?


Jawapan Betul


Saya jumpa jawapan untuk soalan ini.

Saya membenamkan logger slog ke dalam logger tersuai saya.

type Logger struct {
    *slog.Logger
}

Saya juga menulis fungsi eksport untuk struct saya seperti ini:

func (m *GatewayMessage) LoggableData() *xlog.RequestData {
    return &xlog.RequestData{
        Request:             m.Request.String(),
        OriginalRequest:     m.OriginalRequest,
    }
}

func (m *GatewayMessage) PopulateGeneralLogData() []any {
    logData := m.LoggableData()
    return []any{
        "Request", logData.Request,
        "OriginalRequest", logData.OriginalRequest,
    }
}

Saya kemudian menulis fungsi pembantu yang mengambil GatewayMessage ini sebagai parameter bersama-sama dengan sebarang bilangan parameter, seperti fungsi Log Logger slog. Berikut ialah contoh fungsi penyahpepijatan:

func LogDebug(l *xlog.Logger, ctx context.Context, msg string, m *GatewayMessage, args ...any) {
    var generalLogData []any = make([]any, 0)
    if m != nil {
        generalLogData = m.PopulateGeneralLogData()
    }
    args = append(args, generalLogData...)
    l.RuntimeDebug(
        ctx,
        msg,
        args...,
    )
}

Saya juga menggunakan penerima bernama RuntimeDebug untuk menyuntik parameter bernama Skop dalam semua log.

func (l *Logger) RuntimeDebug(ctx context.Context, msg string, args ...any) {
    args = append(args, "Scope", "Runtime")
    l.Logger.Log(
        ctx,
        slog.LevelDebug,
        msg,
        args...,
    )
}

Atas ialah kandungan terperinci Bagaimana untuk melepasi struktur dalam slog logger dan menggunakan medannya secara automatik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam