6 changed files with 183 additions and 0 deletions
@ -0,0 +1,10 @@ |
|||||
|
module gitoa.ru/go-4devs/log/handler/zap |
||||
|
|
||||
|
go 1.21.5 |
||||
|
|
||||
|
require ( |
||||
|
gitoa.ru/go-4devs/log v0.5.1 |
||||
|
go.uber.org/zap v1.26.0 |
||||
|
) |
||||
|
|
||||
|
require go.uber.org/multierr v1.10.0 // indirect |
@ -0,0 +1,16 @@ |
|||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= |
||||
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= |
||||
|
gitoa.ru/go-4devs/log v0.5.1 h1:rrIyjpUaw8AjDCf7ZuH0HgCRf370O3TV29yrU1xizWM= |
||||
|
gitoa.ru/go-4devs/log v0.5.1/go.mod h1:tREtjEH2cTHl0p3uCVcH9g5tlqtsVNI/tDQVfq53Ty4= |
||||
|
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= |
||||
|
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= |
||||
|
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= |
||||
|
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= |
||||
|
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= |
||||
|
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= |
||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= |
||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@ -0,0 +1,66 @@ |
|||||
|
package zap |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/log" |
||||
|
"gitoa.ru/go-4devs/log/entry" |
||||
|
"gitoa.ru/go-4devs/log/field" |
||||
|
"gitoa.ru/go-4devs/log/level" |
||||
|
"go.uber.org/zap" |
||||
|
) |
||||
|
|
||||
|
func Nop() log.Logger { |
||||
|
return New(zap.NewNop()) |
||||
|
} |
||||
|
|
||||
|
func Example(options ...zap.Option) log.Logger { |
||||
|
return New(zap.NewExample(options...)) |
||||
|
} |
||||
|
|
||||
|
func Production(options ...zap.Option) log.Logger { |
||||
|
z, err := zap.NewProduction(options...) |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
|
||||
|
return New(z) |
||||
|
} |
||||
|
|
||||
|
func Development(options ...zap.Option) log.Logger { |
||||
|
z, err := zap.NewDevelopment(options...) |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
|
||||
|
return New(z) |
||||
|
} |
||||
|
|
||||
|
// New create handler by zap logger.
|
||||
|
func New(logger *zap.Logger) log.Logger { |
||||
|
return func(ctx context.Context, data *entry.Entry) (int, error) { |
||||
|
zf := make([]zap.Field, 0, data.Fields().Len()) |
||||
|
data.Fields().Fields(func(f field.Field) bool { |
||||
|
zf = append(zf, zap.Any(f.Key, f.Value.Any())) |
||||
|
|
||||
|
return true |
||||
|
}) |
||||
|
|
||||
|
switch data.Level() { |
||||
|
case level.Emergency: |
||||
|
logger.Fatal(data.Message(), zf...) |
||||
|
case level.Alert: |
||||
|
logger.Panic(data.Message(), zf...) |
||||
|
case level.Critical, level.Error: |
||||
|
logger.Error(data.Message(), zf...) |
||||
|
case level.Warning: |
||||
|
logger.Warn(data.Message(), zf...) |
||||
|
case level.Notice, level.Info: |
||||
|
logger.Info(data.Message(), zf...) |
||||
|
case level.Debug: |
||||
|
logger.Debug(data.Message(), zf...) |
||||
|
} |
||||
|
|
||||
|
return 0, nil |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package zap_test |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"io" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/log/field" |
||||
|
"gitoa.ru/go-4devs/log/handler/zap" |
||||
|
uzap "go.uber.org/zap" |
||||
|
) |
||||
|
|
||||
|
func ExampleNew_zapHandler() { |
||||
|
ctx := context.Background() |
||||
|
log := zap.New(uzap.NewExample()) |
||||
|
log.Err(ctx, "log zap") |
||||
|
log.ErrKV(ctx, "log zap kv", field.Int("int", 42)) |
||||
|
log.ErrKVs(ctx, "log zap kv sugar", "err", io.EOF) |
||||
|
|
||||
|
// Output:
|
||||
|
// {"level":"error","msg":"log zap"}
|
||||
|
// {"level":"error","msg":"log zap kv","int":42}
|
||||
|
// {"level":"error","msg":"log zap kv sugar","err":"EOF"}
|
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
package zap_test |
||||
|
|
||||
|
import ( |
||||
|
"bytes" |
||||
|
"context" |
||||
|
"testing" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/log/entry" |
||||
|
"gitoa.ru/go-4devs/log/field" |
||||
|
zlog "gitoa.ru/go-4devs/log/handler/zap" |
||||
|
"gitoa.ru/go-4devs/log/level" |
||||
|
"go.uber.org/zap" |
||||
|
"go.uber.org/zap/zapcore" |
||||
|
) |
||||
|
|
||||
|
func TestNew(t *testing.T) { |
||||
|
t.Parallel() |
||||
|
|
||||
|
ctx := context.Background() |
||||
|
buf := &bytes.Buffer{} |
||||
|
core := zapcore.NewCore(zapcore.NewJSONEncoder(zapcore.EncoderConfig{ |
||||
|
MessageKey: "msg", |
||||
|
LevelKey: "level", |
||||
|
NameKey: "logger", |
||||
|
EncodeLevel: zapcore.LowercaseLevelEncoder, |
||||
|
EncodeTime: zapcore.ISO8601TimeEncoder, |
||||
|
EncodeDuration: zapcore.StringDurationEncoder, |
||||
|
}), zapcore.AddSync(buf), zapcore.DebugLevel) |
||||
|
logger := zlog.New(zap.New(core)) |
||||
|
expect := `{"level":"info","msg":"handle zap message","env":"test"}` + "\n" |
||||
|
|
||||
|
if _, err := logger(ctx, entry.New( |
||||
|
entry.WithFields(field.String("env", "test")), |
||||
|
entry.WithLevel(level.Notice), |
||||
|
entry.WithMessage("handle zap message"), |
||||
|
)); err != nil { |
||||
|
t.Error(err) |
||||
|
} |
||||
|
|
||||
|
if buf.String() != expect { |
||||
|
t.Errorf("invalid message\n got: %s\nexpect:%s\n", buf.String(), expect) |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue