mirror of
https://github.com/go-kratos/kratos.git
synced 2025-11-06 08:59:18 +02:00
feat(middleware): redacter interface for logging (#2564)
This commit is contained in:
committed by
GitHub
parent
852a77faa6
commit
d12498ed38
@@ -11,6 +11,11 @@ import (
|
|||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Redacter defines how to log an object
|
||||||
|
type Redacter interface {
|
||||||
|
Redact() string
|
||||||
|
}
|
||||||
|
|
||||||
// Server is an server logging middleware.
|
// Server is an server logging middleware.
|
||||||
func Server(logger log.Logger) middleware.Middleware {
|
func Server(logger log.Logger) middleware.Middleware {
|
||||||
return func(handler middleware.Handler) middleware.Handler {
|
return func(handler middleware.Handler) middleware.Handler {
|
||||||
@@ -85,6 +90,9 @@ func Client(logger log.Logger) middleware.Middleware {
|
|||||||
|
|
||||||
// extractArgs returns the string of the req
|
// extractArgs returns the string of the req
|
||||||
func extractArgs(req interface{}) string {
|
func extractArgs(req interface{}) string {
|
||||||
|
if redacter, ok := req.(Redacter); ok {
|
||||||
|
return redacter.Redact()
|
||||||
|
}
|
||||||
if stringer, ok := req.(fmt.Stringer); ok {
|
if stringer, ok := req.(fmt.Stringer); ok {
|
||||||
return stringer.String()
|
return stringer.String()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,19 +105,49 @@ type (
|
|||||||
dummyStringer struct {
|
dummyStringer struct {
|
||||||
field string
|
field string
|
||||||
}
|
}
|
||||||
|
dummyStringerRedacter struct {
|
||||||
|
field string
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (d *dummyStringer) String() string {
|
func (d *dummyStringer) String() string {
|
||||||
return "my value"
|
return "my value"
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExtractArgs(t *testing.T) {
|
func (d *dummyStringerRedacter) String() string {
|
||||||
if extractArgs(&dummyStringer{field: ""}) != "my value" {
|
return "my value"
|
||||||
t.Errorf(`The stringified dummyStringer structure must be equal to "my value", %v given`, extractArgs(&dummyStringer{field: ""}))
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if extractArgs(&dummy{field: "value"}) != "&{field:value}" {
|
func (d *dummyStringerRedacter) Redact() string {
|
||||||
t.Errorf(`The stringified dummy structure must be equal to "&{field:value}", %v given`, extractArgs(&dummy{field: "value"}))
|
return "my value redacted"
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExtractArgs(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
req interface{}
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "dummyStringer",
|
||||||
|
req: &dummyStringer{field: ""},
|
||||||
|
expected: "my value",
|
||||||
|
}, {
|
||||||
|
name: "dummy",
|
||||||
|
req: &dummy{field: "value"},
|
||||||
|
expected: "&{field:value}",
|
||||||
|
}, {
|
||||||
|
name: "dummyStringerRedacter",
|
||||||
|
req: &dummyStringerRedacter{field: ""},
|
||||||
|
expected: "my value redacted",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
if value := extractArgs(test.req); value != test.expected {
|
||||||
|
t.Errorf(`The stringified %s structure must be equal to "%s", %v given`, test.name, test.expected, value)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user