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"
|
||||
)
|
||||
|
||||
// Redacter defines how to log an object
|
||||
type Redacter interface {
|
||||
Redact() string
|
||||
}
|
||||
|
||||
// Server is an server logging middleware.
|
||||
func Server(logger log.Logger) middleware.Middleware {
|
||||
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
|
||||
func extractArgs(req interface{}) string {
|
||||
if redacter, ok := req.(Redacter); ok {
|
||||
return redacter.Redact()
|
||||
}
|
||||
if stringer, ok := req.(fmt.Stringer); ok {
|
||||
return stringer.String()
|
||||
}
|
||||
|
||||
@@ -105,19 +105,49 @@ type (
|
||||
dummyStringer struct {
|
||||
field string
|
||||
}
|
||||
dummyStringerRedacter struct {
|
||||
field string
|
||||
}
|
||||
)
|
||||
|
||||
func (d *dummyStringer) String() string {
|
||||
return "my value"
|
||||
}
|
||||
|
||||
func TestExtractArgs(t *testing.T) {
|
||||
if extractArgs(&dummyStringer{field: ""}) != "my value" {
|
||||
t.Errorf(`The stringified dummyStringer structure must be equal to "my value", %v given`, extractArgs(&dummyStringer{field: ""}))
|
||||
}
|
||||
func (d *dummyStringerRedacter) String() string {
|
||||
return "my value"
|
||||
}
|
||||
|
||||
if extractArgs(&dummy{field: "value"}) != "&{field:value}" {
|
||||
t.Errorf(`The stringified dummy structure must be equal to "&{field:value}", %v given`, extractArgs(&dummy{field: "value"}))
|
||||
func (d *dummyStringerRedacter) Redact() string {
|
||||
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