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

WBOY
Lepaskan: 2024-02-06 08:10:03
ke hadapan
433 orang telah melayarinya

如何在 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(),
)
Salin selepas log masuk

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(),
)
Salin selepas log masuk

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
}
Salin selepas log masuk

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,
    }
}
Salin selepas log masuk

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...,
    )
}
Salin selepas log masuk

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...,
    )
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan