diff --git a/.gitignore b/.gitignore index 74765d2..ccfcd31 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ out/ # config files -config.yaml \ No newline at end of file +config.yaml + +coverage.json +config.env \ No newline at end of file diff --git a/README.md b/README.md index 149ab8a..37a9b57 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ Create a file containing the environment variables mentioned in [`config.yaml.ex ```bash DEBUG=true LOG_LEVEL=debug -LOG_FORMAT=json APP_NAME=darkroom APP_VERSION=0.0.1 diff --git a/cmd/darkroom/main.go b/cmd/darkroom/main.go index 07a0e84..21e06b4 100644 --- a/cmd/darkroom/main.go +++ b/cmd/darkroom/main.go @@ -30,6 +30,7 @@ func main() { } if err := a.Run(os.Args); err != nil { + logger.Errorf("got an error while running main with error: %s", err) panic(err) } } diff --git a/config.yaml.example b/config.yaml.example index 7a9cba8..536d228 100644 --- a/config.yaml.example +++ b/config.yaml.example @@ -2,7 +2,6 @@ debug: "true" log: level: "debug" - format: "text" app: name: "darkroom" diff --git a/go.mod b/go.mod index 81b3b17..01e6f85 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 github.com/anthonynsimon/bild v0.10.0 github.com/aws/aws-sdk-go v1.20.0 - github.com/axw/gocov v0.0.0-20170322000131-3a69a0d2a4ef // indirect + github.com/axw/gocov v1.0.0 // indirect github.com/cactus/go-statsd-client/statsd v0.0.0-20190501063751-9a7692639588 github.com/gojektech/heimdall v5.0.2+incompatible github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect @@ -19,10 +19,11 @@ require ( github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.3.0 github.com/urfave/cli v1.20.0 - golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 // indirect + go.uber.org/zap v1.10.0 + golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443 // indirect golang.org/x/lint v0.0.0-20190409202823-959b441ac422 // indirect - golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 // indirect - golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect + golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b // indirect + golang.org/x/sys v0.0.0-20190620070143-6f217b454f45 // indirect golang.org/x/text v0.3.2 // indirect - golang.org/x/tools v0.0.0-20190617190820-da514acc4774 // indirect + golang.org/x/tools v0.0.0-20190619215442-4adf7a708c2d // indirect ) diff --git a/go.sum b/go.sum index 61ae988..d39d0cb 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ github.com/aws/aws-sdk-go v1.19.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.20.0 h1:t74VM7opfCwwbe+wg6eys4a2wLqky6Znitr7BsqYPUg= github.com/aws/aws-sdk-go v1.20.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/axw/gocov v0.0.0-20170322000131-3a69a0d2a4ef/go.mod h1:pc6XrbIn8RLeVSNzXCZKXNst+RTE5Ju/nySYl1Wc0B4= +github.com/axw/gocov v1.0.0 h1:YsqYR66hUmilVr23tu8USgnJIJvnwh3n7j5zRn7x4LU= +github.com/axw/gocov v1.0.0/go.mod h1:LvQpEYiwwIb2nYkXY2fDWhg9/AsYqkhmrCshjlUJECE= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/cactus/go-statsd-client/statsd v0.0.0-20190501063751-9a7692639588 h1:6yVhh6P5OsW6HutPt7z2ggDgZczgUtSl2kGRe+DslPU= @@ -134,14 +136,18 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422 h1:QzoH/1pFpZguR8NrRHLcO6jKqfv2zpuSqZLgdm7ZmjI= @@ -156,6 +162,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0O golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -175,6 +182,8 @@ golang.org/x/sys v0.0.0-20190614084037-d442b75600c5 h1:tQrtnaPeNyfkuD2UMixVD6lAa golang.org/x/sys v0.0.0-20190614084037-d442b75600c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45 h1:Dl2hc890lrizvUppGbRWhnIh2f8jOTCQpY5IKWRS0oM= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -190,6 +199,8 @@ golang.org/x/tools v0.0.0-20190613204242-ed0dc450797f h1:+zypR5600WBcnJgA2nzZAsB golang.org/x/tools v0.0.0-20190613204242-ed0dc450797f/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774 h1:CQVOmarCBFzTx0kbOU0ru54Cvot8SdSrNYjZPhQl+gk= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190619215442-4adf7a708c2d h1:LQ06Vbju+Kwbcd94hb+6CgDsWoj/e7GOLPcYzHrG+iI= +golang.org/x/tools v0.0.0-20190619215442-4adf7a708c2d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= diff --git a/internal/handler/image.go b/internal/handler/image.go index 42d544c..6f5433b 100644 --- a/internal/handler/image.go +++ b/internal/handler/image.go @@ -19,9 +19,10 @@ const ( func ImageHandler(deps *service.Dependencies) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + l := logger.SugaredWithRequest(r) res := deps.Storage.Get(r.Context(), r.URL.Path) if res.Error() != nil { - logger.Errorf("error: %s", res.Error()) + l.Errorf("error from Storage.Get: %s", res.Error()) metrics.Update(metrics.UpdateOption{Name: StorageGetErrorKey, Type: metrics.Count}) w.WriteHeader(res.Status()) return @@ -40,7 +41,7 @@ func ImageHandler(deps *service.Dependencies) http.HandlerFunc { } data, err = deps.Manipulator.Process(r.Context(), data, params) if err != nil { - logger.Errorf("error: %s", res.Error()) + l.Errorf("error from Manipulator.Process: %s", err) metrics.Update(metrics.UpdateOption{Name: ProcessorErrorKey, Type: metrics.Count}) w.WriteHeader(http.StatusUnprocessableEntity) return diff --git a/internal/handler/image_test.go b/internal/handler/image_test.go index fb4ef72..6a18251 100644 --- a/internal/handler/image_test.go +++ b/internal/handler/image_test.go @@ -93,10 +93,7 @@ type mockManipulator struct { func (m *mockManipulator) Process(ctx context.Context, data []byte, params map[string]string) ([]byte, error) { args := m.Called(ctx, data, params) - if args.Get(1) == nil { - return args.Get(0).([]byte), nil - } - return args.Get(0).([]byte), args.Get(1).(error) + return args.Get(0).([]byte), args.Error(1) } type mockStorage struct { diff --git a/internal/handler/ping.go b/internal/handler/ping.go index 67b2b24..191625f 100644 --- a/internal/handler/ping.go +++ b/internal/handler/ping.go @@ -5,7 +5,7 @@ import ( ) func Ping() http.HandlerFunc { - return func(w http.ResponseWriter, _ *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("pong")) return diff --git a/pkg/config/config.go b/pkg/config/config.go index 381c53d..7395aba 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -7,7 +7,7 @@ import ( ) type config struct { - logger loggerConfig + logLevel string app app debugMode bool port int @@ -48,10 +48,7 @@ func newConfig() *config { s.readValue() return &config{ - logger: loggerConfig{ - level: v.GetString("log.level"), - format: v.GetString("log.format"), - }, + logLevel: v.GetString("log.level"), app: app{ name: v.GetString("app.Name"), version: v.GetString("app.version"), @@ -69,11 +66,7 @@ func Update() { } func LogLevel() string { - return getConfig().logger.level -} - -func LogFormat() string { - return getConfig().logger.format + return getConfig().logLevel } func AppName() string { diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 85570b2..f18cdb8 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -27,10 +27,6 @@ func TestConfigCases(t *testing.T) { key: "log.level", callFunc: LogLevel, }, - { - key: "log.format", - callFunc: LogFormat, - }, } for _, c := range cases { diff --git a/pkg/config/types.go b/pkg/config/types.go index 8ff84fa..3e0be34 100644 --- a/pkg/config/types.go +++ b/pkg/config/types.go @@ -5,11 +5,6 @@ import ( "***REMOVED***/darkroom/core/pkg/storage" ) -type loggerConfig struct { - level string - format string -} - type app struct { name string version string diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index bd784fe..c6c8483 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -2,126 +2,114 @@ package logger import ( "net/http" - "os" "sync" - "github.com/sirupsen/logrus" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" "***REMOVED***/darkroom/core/pkg/config" ) -var instance *logrus.Logger +var instance *zap.Logger +var sugarInstance *zap.SugaredLogger var once sync.Once -const jsonLoggerType = "json" - -func getLogger() *logrus.Logger { +func getLogger() *zap.Logger { once.Do(func() { instance = newLogger() }) return instance } -func getLogLevel() logrus.Level { +func getSugaredLogger() *zap.SugaredLogger { + if sugarInstance == nil { + sugarInstance = getLogger().Sugar() + } + return sugarInstance +} + +func getLogLevel() zapcore.Level { if config.LogLevel() == "" { - return logrus.DebugLevel + return zap.DebugLevel } - level, err := logrus.ParseLevel(config.LogLevel()) - if err != nil { + var level zapcore.Level + if err := level.UnmarshalText([]byte(config.LogLevel())); err != nil { + Errorf("failed to parse log level from config with error: %s", err) panic(err) } return level } -func newLogger() *logrus.Logger { - logger := &logrus.Logger{ - Out: os.Stdout, - Hooks: make(logrus.LevelHooks), - Level: getLogLevel(), - } - if config.LogFormat() == jsonLoggerType { - logger.Formatter = &logrus.JSONFormatter{} +func newLogger() *zap.Logger { + loggerConfig := zap.NewProductionConfig() + loggerConfig.Level = zap.NewAtomicLevelAt(getLogLevel()) + loggerConfig.Encoding = "json" + loggerConfig.DisableCaller = true + loggerConfig.OutputPaths = []string{"stdout"} + if logger, err := loggerConfig.Build(); err != nil { + Errorf("failed to create new logger with error: %s", err) + panic(err) } else { - logger.Formatter = &logrus.TextFormatter{} + return logger } - return logger -} - -func AddHook(hook logrus.Hook) { - getLogger().Hooks.Add(hook) -} - -func Debug(args ...interface{}) { - getLogger().Debug(args...) } -func Debugf(format string, args ...interface{}) { - getLogger().Debugf(format, args...) +func Debug(message string, fields ...zap.Field) { + getLogger().Debug(message, fields...) } -func Debugln(args ...interface{}) { - getLogger().Debugln(args...) +func Debugf(template string, args ...interface{}) { + getSugaredLogger().Debugf(template, args) } -func Error(args ...interface{}) { - getLogger().Error(args...) +func Error(message string, fields ...zap.Field) { + getLogger().Error(message, fields...) } -func Errorf(format string, args ...interface{}) { - getLogger().Errorf(format, args...) +func Errorf(template string, args ...interface{}) { + getSugaredLogger().Errorf(template, args) } -func Errorln(args ...interface{}) { - getLogger().Errorln(args...) +func Fatal(message string, fields ...zap.Field) { + getLogger().Fatal(message, fields...) } -func Fatal(args ...interface{}) { - getLogger().Fatal(args...) +func Fatalf(template string, args ...interface{}) { + getSugaredLogger().Fatalf(template, args) } -func Fatalf(format string, args ...interface{}) { - getLogger().Fatalf(format, args...) +func Info(message string, fields ...zap.Field) { + getLogger().Info(message, fields...) } -func Fatalln(args ...interface{}) { - getLogger().Fatalln(args...) +func Infof(template string, args ...interface{}) { + getSugaredLogger().Infof(template, args) } -func Info(args ...interface{}) { - getLogger().Info(args...) +func Warn(message string, fields ...zap.Field) { + getLogger().Warn(message, fields...) } -func Infof(format string, args ...interface{}) { - getLogger().Infof(format, args...) +func Warnf(template string, args ...interface{}) { + getSugaredLogger().Warnf(template, args) } -func Infoln(args ...interface{}) { - getLogger().Infoln(args...) +func AddHook(hook func(zapcore.Entry) error) { + instance = getLogger().WithOptions(zap.Hooks(hook)) + sugarInstance = instance.Sugar() } -func Warn(args ...interface{}) { - getLogger().Warn(args...) +func WithRequest(r *http.Request) *zap.Logger { + return getLogger().With( + zap.Any("method", r.Method), + zap.Any("host", r.Host), + zap.Any("path", r.URL.Path), + ) } -func Warnf(format string, args ...interface{}) { - getLogger().Warnf(format, args...) -} - -func Warnln(args ...interface{}) { - getLogger().Warnln(args...) -} - -func WithField(key string, value interface{}) *logrus.Entry { - return getLogger().WithField(key, value) -} - -func WithFields(fields logrus.Fields) *logrus.Entry { - return getLogger().WithFields(fields) -} - -func WithRequest(r *http.Request) *logrus.Entry { - return getLogger().WithFields(logrus.Fields{ - "Method": r.Method, - "Host": r.Host, - "Path": r.URL.Path, - }) +func SugaredWithRequest(r *http.Request) *zap.SugaredLogger { + return getSugaredLogger().With( + zap.Any("method", r.Method), + zap.Any("host", r.Host), + zap.Any("path", r.URL.Path), + ) } diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go index 057733e..306d5c7 100644 --- a/pkg/logger/logger_test.go +++ b/pkg/logger/logger_test.go @@ -1,152 +1,133 @@ package logger import ( - "github.com/sirupsen/logrus" - "github.com/sirupsen/logrus/hooks/test" + "fmt" "github.com/stretchr/testify/assert" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" "net/http" "testing" ) +func makeLogsStorageHooks() (func(zapcore.Entry) error, **[]zapcore.Entry) { + var pointerToStorage *[]zapcore.Entry + initialStorage := make([]zapcore.Entry, 0) + pointerToStorage = &initialStorage + return func(entry zapcore.Entry) error { + newStorage := append(*pointerToStorage, entry) + pointerToStorage = &newStorage + return nil + }, &pointerToStorage +} + func TestLogger(t *testing.T) { - hook := test.NewLocal(getLogger()) + hook, ptr := makeLogsStorageHooks() AddHook(hook) cases := []struct { message string - level logrus.Level - callFunc func(args ...interface{}) + level zapcore.Level + callFunc func(message string, fields ...zap.Field) }{ { message: "warning message", - level: logrus.WarnLevel, + level: zap.WarnLevel, callFunc: Warn, }, - { - message: "warning message in new line", - level: logrus.WarnLevel, - callFunc: Warnln, - }, { message: "debug message", - level: logrus.DebugLevel, + level: zap.DebugLevel, callFunc: Debug, }, - { - message: "debug message in new line", - level: logrus.DebugLevel, - callFunc: Debugln, - }, { message: "error message", - level: logrus.ErrorLevel, + level: zap.ErrorLevel, callFunc: Error, }, - { - message: "debug message in new line", - level: logrus.ErrorLevel, - callFunc: Errorln, - }, { message: "info message", - level: logrus.InfoLevel, + level: zap.InfoLevel, callFunc: Info, }, - { - message: "info message in new line", - level: logrus.InfoLevel, - callFunc: Infoln, - }, } for i, c := range cases { c.callFunc(c.message) - assert.Equal(t, (i+1)*2, len(hook.Entries)) - assert.Equal(t, c.level, hook.LastEntry().Level) - assert.Equal(t, c.message, hook.LastEntry().Message) + logsStorage := **ptr + assert.Equal(t, i+1, len(logsStorage)) + assert.Equal(t, c.level, logsStorage[len(logsStorage)-1].Level) + assert.Equal(t, c.message, logsStorage[len(logsStorage)-1].Message) } } func TestLoggerFormatter(t *testing.T) { - hook := test.NewLocal(getLogger()) + hook, ptr := makeLogsStorageHooks() AddHook(hook) cases := []struct { - format string - level logrus.Level + template string + level zapcore.Level args []string callFunc func(format string, args ...interface{}) }{ { - format: "warning message: %s", - level: logrus.WarnLevel, + template: "warning message: %s", + level: zap.WarnLevel, args: []string{"WARNING"}, callFunc: Warnf, }, { - format: "debug message: %s", - level: logrus.DebugLevel, + template: "debug message: %s", + level: zap.DebugLevel, args: []string{"DEBUG"}, callFunc: Debugf, }, { - format: "error message: %s", - level: logrus.ErrorLevel, + template: "error message: %s", + level: zap.ErrorLevel, args: []string{"ERROR"}, callFunc: Errorf, }, { - format: "info message: %s", - level: logrus.InfoLevel, + template: "info message: %s", + level: zap.InfoLevel, args: []string{"INFO"}, callFunc: Infof, }, } for i, c := range cases { - c.callFunc(c.format, c.args) - assert.Equal(t, (i+1)*2, len(hook.Entries)) - assert.Equal(t, c.level, hook.LastEntry().Level) + c.callFunc(c.template, c.args) + logsStorage := **ptr + assert.Equal(t, i+1, len(logsStorage)) + assert.Equal(t, c.level, logsStorage[len(logsStorage)-1].Level) } } -func TestLoggerWithFields(t *testing.T) { - hook := test.NewLocal(getLogger()) - AddHook(hook) - - msg := "WithFields" - - fields := make(map[string]interface{}) - fields["key"] = "value" - WithFields(fields).Warn(msg) - - assert.Equal(t, 2, len(hook.Entries)) - assert.Equal(t, logrus.WarnLevel, hook.LastEntry().Level) - assert.Equal(t, msg, hook.LastEntry().Message) -} - -func TestLoggerWithField(t *testing.T) { - hook := test.NewLocal(getLogger()) +func TestLoggerWithRequest(t *testing.T) { + hook, pointerToLogsStorage := makeLogsStorageHooks() AddHook(hook) + msg := "success" + req, _ := http.NewRequest(http.MethodGet, "https://example.com/path/to/resource", nil) - msg := "WithField" - - WithField("key", "value").Warn(msg) + WithRequest(req).Info(msg) - assert.Equal(t, 2, len(hook.Entries)) - assert.Equal(t, logrus.WarnLevel, hook.LastEntry().Level) - assert.Equal(t, msg, hook.LastEntry().Message) + storage := **pointerToLogsStorage + assert.Equal(t, 1, len(storage)) + assert.Equal(t, zap.InfoLevel, storage[0].Level) + assert.Equal(t, msg, storage[0].Message) } -func TestLoggerWithRequest(t *testing.T) { - hook := test.NewLocal(getLogger()) +func TestSugaredLoggerWithRequest(t *testing.T) { + hook, pointerToLogsStorage := makeLogsStorageHooks() AddHook(hook) - msg := "success" - req, _ := http.NewRequest(http.MethodGet, "https://example.com/path/to/resource", nil) + url := "https://example.com/path/to/resource" + req, _ := http.NewRequest(http.MethodGet, url, nil) - WithRequest(req).Info(msg) + SugaredWithRequest(req).Infof("success getting %s", url) - assert.Equal(t, 2, len(hook.Entries)) - assert.Equal(t, logrus.InfoLevel, hook.LastEntry().Level) - assert.Equal(t, msg, hook.LastEntry().Message) + storage := **pointerToLogsStorage + assert.Equal(t, 1, len(storage)) + assert.Equal(t, zap.InfoLevel, storage[0].Level) + assert.Equal(t, fmt.Sprintf("success getting %s", url), storage[0].Message) } diff --git a/pkg/metrics/statsd_collector.go b/pkg/metrics/statsd_collector.go index 239e7d1..017e6b9 100644 --- a/pkg/metrics/statsd_collector.go +++ b/pkg/metrics/statsd_collector.go @@ -76,6 +76,6 @@ func Update(updateOption UpdateOption) { break } if err != nil { - logger.Error(err) + logger.Errorf("metrics.Update got an error: %s", err) } }