diff --git a/lib/go/test/fuzz/go.mod b/lib/go/test/fuzz/go.mod
index 4ff6c5d..b7ddd5f 100644
--- a/lib/go/test/fuzz/go.mod
+++ b/lib/go/test/fuzz/go.mod
@@ -1,6 +1,6 @@
 module github.com/apache/thrift/lib/go/test/fuzz
 
-go 1.20
+go 1.21
 
 require github.com/apache/thrift v0.0.0-00010101000000-000000000000
 
diff --git a/lib/go/test/go.mod b/lib/go/test/go.mod
index 59535e6..0c032b7 100644
--- a/lib/go/test/go.mod
+++ b/lib/go/test/go.mod
@@ -1,6 +1,6 @@
 module github.com/apache/thrift/lib/go/test
 
-go 1.20
+go 1.21
 
 require (
 	github.com/apache/thrift v0.0.0-00010101000000-000000000000
diff --git a/lib/go/thrift/debug_protocol.go b/lib/go/thrift/debug_protocol.go
index 83ccad9..d730411 100644
--- a/lib/go/thrift/debug_protocol.go
+++ b/lib/go/thrift/debug_protocol.go
@@ -21,7 +21,7 @@
 
 import (
 	"context"
-	"fmt"
+	"log/slog"
 )
 
 type TDebugProtocol struct {
@@ -34,7 +34,11 @@
 	// If Logger is nil, StdLogger using stdlib log package with os.Stderr
 	// will be used. If disable logging is desired, set Logger to NopLogger
 	// explicitly instead of leaving it as nil/unset.
-	Logger    Logger
+	//
+	// Deprecated: TDebugProtocol always use slog at debug level now.
+	// This field will be removed in a future version.
+	Logger Logger
+
 	LogPrefix string
 
 	// Optional. An TProtocol to duplicate everything read/written from Delegate.
@@ -86,13 +90,16 @@
 	}
 }
 
-func (tdp *TDebugProtocol) logf(format string, v ...interface{}) {
-	fallbackLogger(tdp.Logger)(fmt.Sprintf(format, v...))
-}
-
 func (tdp *TDebugProtocol) WriteMessageBegin(ctx context.Context, name string, typeId TMessageType, seqid int32) error {
 	err := tdp.Delegate.WriteMessageBegin(ctx, name, typeId, seqid)
-	tdp.logf("%sWriteMessageBegin(name=%#v, typeId=%#v, seqid=%#v) => %#v", tdp.LogPrefix, name, typeId, seqid, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteMessageBegin",
+		"name", name,
+		"typeId", typeId,
+		"seqid", seqid,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMessageBegin(ctx, name, typeId, seqid)
 	}
@@ -100,7 +107,11 @@
 }
 func (tdp *TDebugProtocol) WriteMessageEnd(ctx context.Context) error {
 	err := tdp.Delegate.WriteMessageEnd(ctx)
-	tdp.logf("%sWriteMessageEnd() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteMessageEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMessageEnd(ctx)
 	}
@@ -108,7 +119,12 @@
 }
 func (tdp *TDebugProtocol) WriteStructBegin(ctx context.Context, name string) error {
 	err := tdp.Delegate.WriteStructBegin(ctx, name)
-	tdp.logf("%sWriteStructBegin(name=%#v) => %#v", tdp.LogPrefix, name, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteStructBegin",
+		"name", name,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteStructBegin(ctx, name)
 	}
@@ -116,7 +132,11 @@
 }
 func (tdp *TDebugProtocol) WriteStructEnd(ctx context.Context) error {
 	err := tdp.Delegate.WriteStructEnd(ctx)
-	tdp.logf("%sWriteStructEnd() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteStructEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteStructEnd(ctx)
 	}
@@ -124,7 +144,14 @@
 }
 func (tdp *TDebugProtocol) WriteFieldBegin(ctx context.Context, name string, typeId TType, id int16) error {
 	err := tdp.Delegate.WriteFieldBegin(ctx, name, typeId, id)
-	tdp.logf("%sWriteFieldBegin(name=%#v, typeId=%#v, id%#v) => %#v", tdp.LogPrefix, name, typeId, id, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteFieldBegin",
+		"name", name,
+		"typeId", typeId,
+		"id", id,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteFieldBegin(ctx, name, typeId, id)
 	}
@@ -132,7 +159,11 @@
 }
 func (tdp *TDebugProtocol) WriteFieldEnd(ctx context.Context) error {
 	err := tdp.Delegate.WriteFieldEnd(ctx)
-	tdp.logf("%sWriteFieldEnd() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteFieldEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteFieldEnd(ctx)
 	}
@@ -140,7 +171,11 @@
 }
 func (tdp *TDebugProtocol) WriteFieldStop(ctx context.Context) error {
 	err := tdp.Delegate.WriteFieldStop(ctx)
-	tdp.logf("%sWriteFieldStop() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteFieldStop",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteFieldStop(ctx)
 	}
@@ -148,7 +183,14 @@
 }
 func (tdp *TDebugProtocol) WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error {
 	err := tdp.Delegate.WriteMapBegin(ctx, keyType, valueType, size)
-	tdp.logf("%sWriteMapBegin(keyType=%#v, valueType=%#v, size=%#v) => %#v", tdp.LogPrefix, keyType, valueType, size, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteMapBegin",
+		"keyType", keyType,
+		"valueType", valueType,
+		"size", size,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMapBegin(ctx, keyType, valueType, size)
 	}
@@ -156,7 +198,11 @@
 }
 func (tdp *TDebugProtocol) WriteMapEnd(ctx context.Context) error {
 	err := tdp.Delegate.WriteMapEnd(ctx)
-	tdp.logf("%sWriteMapEnd() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteMapEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMapEnd(ctx)
 	}
@@ -164,7 +210,13 @@
 }
 func (tdp *TDebugProtocol) WriteListBegin(ctx context.Context, elemType TType, size int) error {
 	err := tdp.Delegate.WriteListBegin(ctx, elemType, size)
-	tdp.logf("%sWriteListBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteListBegin",
+		"elemType", elemType,
+		"size", size,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteListBegin(ctx, elemType, size)
 	}
@@ -172,7 +224,11 @@
 }
 func (tdp *TDebugProtocol) WriteListEnd(ctx context.Context) error {
 	err := tdp.Delegate.WriteListEnd(ctx)
-	tdp.logf("%sWriteListEnd() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteListEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteListEnd(ctx)
 	}
@@ -180,7 +236,13 @@
 }
 func (tdp *TDebugProtocol) WriteSetBegin(ctx context.Context, elemType TType, size int) error {
 	err := tdp.Delegate.WriteSetBegin(ctx, elemType, size)
-	tdp.logf("%sWriteSetBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteSetBegin",
+		"elemType", elemType,
+		"size", size,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteSetBegin(ctx, elemType, size)
 	}
@@ -188,7 +250,11 @@
 }
 func (tdp *TDebugProtocol) WriteSetEnd(ctx context.Context) error {
 	err := tdp.Delegate.WriteSetEnd(ctx)
-	tdp.logf("%sWriteSetEnd() => %#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteSetEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteSetEnd(ctx)
 	}
@@ -196,7 +262,12 @@
 }
 func (tdp *TDebugProtocol) WriteBool(ctx context.Context, value bool) error {
 	err := tdp.Delegate.WriteBool(ctx, value)
-	tdp.logf("%sWriteBool(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteBool",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteBool(ctx, value)
 	}
@@ -204,7 +275,12 @@
 }
 func (tdp *TDebugProtocol) WriteByte(ctx context.Context, value int8) error {
 	err := tdp.Delegate.WriteByte(ctx, value)
-	tdp.logf("%sWriteByte(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteByte",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteByte(ctx, value)
 	}
@@ -212,7 +288,12 @@
 }
 func (tdp *TDebugProtocol) WriteI16(ctx context.Context, value int16) error {
 	err := tdp.Delegate.WriteI16(ctx, value)
-	tdp.logf("%sWriteI16(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteI16",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteI16(ctx, value)
 	}
@@ -220,7 +301,12 @@
 }
 func (tdp *TDebugProtocol) WriteI32(ctx context.Context, value int32) error {
 	err := tdp.Delegate.WriteI32(ctx, value)
-	tdp.logf("%sWriteI32(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteI32",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteI32(ctx, value)
 	}
@@ -228,7 +314,12 @@
 }
 func (tdp *TDebugProtocol) WriteI64(ctx context.Context, value int64) error {
 	err := tdp.Delegate.WriteI64(ctx, value)
-	tdp.logf("%sWriteI64(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteI64",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteI64(ctx, value)
 	}
@@ -236,7 +327,12 @@
 }
 func (tdp *TDebugProtocol) WriteDouble(ctx context.Context, value float64) error {
 	err := tdp.Delegate.WriteDouble(ctx, value)
-	tdp.logf("%sWriteDouble(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteDouble",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteDouble(ctx, value)
 	}
@@ -244,7 +340,12 @@
 }
 func (tdp *TDebugProtocol) WriteString(ctx context.Context, value string) error {
 	err := tdp.Delegate.WriteString(ctx, value)
-	tdp.logf("%sWriteString(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteString",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteString(ctx, value)
 	}
@@ -252,7 +353,12 @@
 }
 func (tdp *TDebugProtocol) WriteBinary(ctx context.Context, value []byte) error {
 	err := tdp.Delegate.WriteBinary(ctx, value)
-	tdp.logf("%sWriteBinary(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteBinary",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteBinary(ctx, value)
 	}
@@ -260,7 +366,12 @@
 }
 func (tdp *TDebugProtocol) WriteUUID(ctx context.Context, value Tuuid) error {
 	err := tdp.Delegate.WriteUUID(ctx, value)
-	tdp.logf("%sWriteUUID(value=%#v) => %#v", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"WriteUUID",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteUUID(ctx, value)
 	}
@@ -269,7 +380,14 @@
 
 func (tdp *TDebugProtocol) ReadMessageBegin(ctx context.Context) (name string, typeId TMessageType, seqid int32, err error) {
 	name, typeId, seqid, err = tdp.Delegate.ReadMessageBegin(ctx)
-	tdp.logf("%sReadMessageBegin() (name=%#v, typeId=%#v, seqid=%#v, err=%#v)", tdp.LogPrefix, name, typeId, seqid, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadMessageBegin",
+		"name", name,
+		"typeId", typeId,
+		"seqid", seqid,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMessageBegin(ctx, name, typeId, seqid)
 	}
@@ -277,7 +395,11 @@
 }
 func (tdp *TDebugProtocol) ReadMessageEnd(ctx context.Context) (err error) {
 	err = tdp.Delegate.ReadMessageEnd(ctx)
-	tdp.logf("%sReadMessageEnd() err=%#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadMessageEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMessageEnd(ctx)
 	}
@@ -285,7 +407,12 @@
 }
 func (tdp *TDebugProtocol) ReadStructBegin(ctx context.Context) (name string, err error) {
 	name, err = tdp.Delegate.ReadStructBegin(ctx)
-	tdp.logf("%sReadStructBegin() (name%#v, err=%#v)", tdp.LogPrefix, name, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadStructBegin",
+		"name", name,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteStructBegin(ctx, name)
 	}
@@ -293,7 +420,11 @@
 }
 func (tdp *TDebugProtocol) ReadStructEnd(ctx context.Context) (err error) {
 	err = tdp.Delegate.ReadStructEnd(ctx)
-	tdp.logf("%sReadStructEnd() err=%#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadStructEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteStructEnd(ctx)
 	}
@@ -301,7 +432,14 @@
 }
 func (tdp *TDebugProtocol) ReadFieldBegin(ctx context.Context) (name string, typeId TType, id int16, err error) {
 	name, typeId, id, err = tdp.Delegate.ReadFieldBegin(ctx)
-	tdp.logf("%sReadFieldBegin() (name=%#v, typeId=%#v, id=%#v, err=%#v)", tdp.LogPrefix, name, typeId, id, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadFieldBegin",
+		"name", name,
+		"typeId", typeId,
+		"id", id,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteFieldBegin(ctx, name, typeId, id)
 	}
@@ -309,7 +447,11 @@
 }
 func (tdp *TDebugProtocol) ReadFieldEnd(ctx context.Context) (err error) {
 	err = tdp.Delegate.ReadFieldEnd(ctx)
-	tdp.logf("%sReadFieldEnd() err=%#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadFieldEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteFieldEnd(ctx)
 	}
@@ -317,7 +459,14 @@
 }
 func (tdp *TDebugProtocol) ReadMapBegin(ctx context.Context) (keyType TType, valueType TType, size int, err error) {
 	keyType, valueType, size, err = tdp.Delegate.ReadMapBegin(ctx)
-	tdp.logf("%sReadMapBegin() (keyType=%#v, valueType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, keyType, valueType, size, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadMapBegin",
+		"keyType", keyType,
+		"valueType", valueType,
+		"size", size,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMapBegin(ctx, keyType, valueType, size)
 	}
@@ -325,7 +474,11 @@
 }
 func (tdp *TDebugProtocol) ReadMapEnd(ctx context.Context) (err error) {
 	err = tdp.Delegate.ReadMapEnd(ctx)
-	tdp.logf("%sReadMapEnd() err=%#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadMapEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteMapEnd(ctx)
 	}
@@ -333,7 +486,13 @@
 }
 func (tdp *TDebugProtocol) ReadListBegin(ctx context.Context) (elemType TType, size int, err error) {
 	elemType, size, err = tdp.Delegate.ReadListBegin(ctx)
-	tdp.logf("%sReadListBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadListBegin",
+		"elemType", elemType,
+		"size", size,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteListBegin(ctx, elemType, size)
 	}
@@ -341,7 +500,11 @@
 }
 func (tdp *TDebugProtocol) ReadListEnd(ctx context.Context) (err error) {
 	err = tdp.Delegate.ReadListEnd(ctx)
-	tdp.logf("%sReadListEnd() err=%#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadListEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteListEnd(ctx)
 	}
@@ -349,7 +512,13 @@
 }
 func (tdp *TDebugProtocol) ReadSetBegin(ctx context.Context) (elemType TType, size int, err error) {
 	elemType, size, err = tdp.Delegate.ReadSetBegin(ctx)
-	tdp.logf("%sReadSetBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadSetBegin",
+		"elemType", elemType,
+		"size", size,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteSetBegin(ctx, elemType, size)
 	}
@@ -357,7 +526,11 @@
 }
 func (tdp *TDebugProtocol) ReadSetEnd(ctx context.Context) (err error) {
 	err = tdp.Delegate.ReadSetEnd(ctx)
-	tdp.logf("%sReadSetEnd() err=%#v", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadSetEnd",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteSetEnd(ctx)
 	}
@@ -365,7 +538,12 @@
 }
 func (tdp *TDebugProtocol) ReadBool(ctx context.Context) (value bool, err error) {
 	value, err = tdp.Delegate.ReadBool(ctx)
-	tdp.logf("%sReadBool() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadBool",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteBool(ctx, value)
 	}
@@ -373,7 +551,12 @@
 }
 func (tdp *TDebugProtocol) ReadByte(ctx context.Context) (value int8, err error) {
 	value, err = tdp.Delegate.ReadByte(ctx)
-	tdp.logf("%sReadByte() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadByte",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteByte(ctx, value)
 	}
@@ -381,7 +564,12 @@
 }
 func (tdp *TDebugProtocol) ReadI16(ctx context.Context) (value int16, err error) {
 	value, err = tdp.Delegate.ReadI16(ctx)
-	tdp.logf("%sReadI16() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadI16",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteI16(ctx, value)
 	}
@@ -389,7 +577,12 @@
 }
 func (tdp *TDebugProtocol) ReadI32(ctx context.Context) (value int32, err error) {
 	value, err = tdp.Delegate.ReadI32(ctx)
-	tdp.logf("%sReadI32() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadI32",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteI32(ctx, value)
 	}
@@ -397,7 +590,12 @@
 }
 func (tdp *TDebugProtocol) ReadI64(ctx context.Context) (value int64, err error) {
 	value, err = tdp.Delegate.ReadI64(ctx)
-	tdp.logf("%sReadI64() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadI64",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteI64(ctx, value)
 	}
@@ -405,7 +603,12 @@
 }
 func (tdp *TDebugProtocol) ReadDouble(ctx context.Context) (value float64, err error) {
 	value, err = tdp.Delegate.ReadDouble(ctx)
-	tdp.logf("%sReadDouble() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadDouble",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteDouble(ctx, value)
 	}
@@ -413,7 +616,12 @@
 }
 func (tdp *TDebugProtocol) ReadString(ctx context.Context) (value string, err error) {
 	value, err = tdp.Delegate.ReadString(ctx)
-	tdp.logf("%sReadString() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadString",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteString(ctx, value)
 	}
@@ -421,7 +629,12 @@
 }
 func (tdp *TDebugProtocol) ReadBinary(ctx context.Context) (value []byte, err error) {
 	value, err = tdp.Delegate.ReadBinary(ctx)
-	tdp.logf("%sReadBinary() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadBinary",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteBinary(ctx, value)
 	}
@@ -429,7 +642,12 @@
 }
 func (tdp *TDebugProtocol) ReadUUID(ctx context.Context) (value Tuuid, err error) {
 	value, err = tdp.Delegate.ReadUUID(ctx)
-	tdp.logf("%sReadUUID() (value=%#v, err=%#v)", tdp.LogPrefix, value, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"ReadUUID",
+		"value", value,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.WriteUUID(ctx, value)
 	}
@@ -437,7 +655,12 @@
 }
 func (tdp *TDebugProtocol) Skip(ctx context.Context, fieldType TType) (err error) {
 	err = tdp.Delegate.Skip(ctx, fieldType)
-	tdp.logf("%sSkip(fieldType=%#v) (err=%#v)", tdp.LogPrefix, fieldType, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"Skip",
+		"fieldType", fieldType,
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.Skip(ctx, fieldType)
 	}
@@ -445,7 +668,11 @@
 }
 func (tdp *TDebugProtocol) Flush(ctx context.Context) (err error) {
 	err = tdp.Delegate.Flush(ctx)
-	tdp.logf("%sFlush() (err=%#v)", tdp.LogPrefix, err)
+	slog.DebugContext(
+		ctx,
+		tdp.LogPrefix+"Flush",
+		"err", err,
+	)
 	if tdp.DuplicateTo != nil {
 		tdp.DuplicateTo.Flush(ctx)
 	}
diff --git a/lib/go/thrift/logger.go b/lib/go/thrift/logger.go
index c42aac9..4a0affe 100644
--- a/lib/go/thrift/logger.go
+++ b/lib/go/thrift/logger.go
@@ -35,14 +35,23 @@
 //
 // See https://issues.apache.org/jira/browse/THRIFT-4985 for the design
 // discussion behind it.
+//
+// Deprecated: This is no longer used by any thrift go library code,
+// will be removed in the future version.
 type Logger func(msg string)
 
 // NopLogger is a Logger implementation that does nothing.
+//
+// Deprecated: This is no longer used by any thrift go library code,
+// will be removed in the future version.
 func NopLogger(msg string) {}
 
 // StdLogger wraps stdlib log package into a Logger.
 //
 // If logger passed in is nil, it will fallback to use stderr and default flags.
+//
+// Deprecated: This is no longer used by any thrift go library code,
+// will be removed in the future version.
 func StdLogger(logger *log.Logger) Logger {
 	if logger == nil {
 		logger = log.New(os.Stderr, "", log.LstdFlags)
@@ -55,6 +64,9 @@
 // TestLogger is a Logger implementation can be used in test codes.
 //
 // It fails the test when being called.
+//
+// Deprecated: This is no longer used by any thrift go library code,
+// will be removed in the future version.
 func TestLogger(tb testing.TB) Logger {
 	return func(msg string) {
 		tb.Errorf("logger called with msg: %q", msg)
diff --git a/lib/go/thrift/simple_server.go b/lib/go/thrift/simple_server.go
index d4f555c..a8634fc 100644
--- a/lib/go/thrift/simple_server.go
+++ b/lib/go/thrift/simple_server.go
@@ -22,8 +22,8 @@
 import (
 	"context"
 	"errors"
-	"fmt"
 	"io"
+	"log/slog"
 	"net"
 	"sync"
 	"sync/atomic"
@@ -70,7 +70,7 @@
 	// Headers to auto forward in THeaderProtocol
 	forwardHeaders []string
 
-	logger Logger
+	logContext atomic.Pointer[context.Context]
 }
 
 func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer {
@@ -179,8 +179,18 @@
 //
 // If no logger was set before Serve is called, a default logger using standard
 // log library will be used.
-func (p *TSimpleServer) SetLogger(logger Logger) {
-	p.logger = logger
+//
+// Deprecated: The logging inside TSimpleServer is now done via slog on error
+// level, this does nothing now. It will be removed in a future version.
+func (p *TSimpleServer) SetLogger(_ Logger) {}
+
+// SetLogContext sets the context to be used when logging errors inside
+// TSimpleServer.
+//
+// If this is not called before calling Serve, context.Background() will be
+// used.
+func (p *TSimpleServer) SetLogContext(ctx context.Context) {
+	p.logContext.Store(&ctx)
 }
 
 func (p *TSimpleServer) innerAccept() (int32, error) {
@@ -202,7 +212,8 @@
 			defer p.wg.Done()
 			defer cancel()
 			if err := p.processRequests(client); err != nil {
-				p.logger(fmt.Sprintf("error processing request: %v", err))
+				ctx := p.logContext.Load()
+				slog.ErrorContext(*ctx, "error processing request", "err", err)
 			}
 		}()
 
@@ -233,7 +244,7 @@
 }
 
 func (p *TSimpleServer) Serve() error {
-	p.logger = fallbackLogger(p.logger)
+	p.logContext.CompareAndSwap(nil, Pointer(context.Background()))
 
 	err := p.Listen()
 	if err != nil {
