From e566b2ffaa578329be1aeaa4da620ecc4326bfd5 Mon Sep 17 00:00:00 2001 From: ybkuroki <45133652+ybkuroki@users.noreply.github.com> Date: Wed, 23 Feb 2022 13:35:19 +0900 Subject: [PATCH] Add interface to the Logger --- container/container.go | 8 ++++---- logger/gormlogger.go | 16 ++++++++-------- logger/logger.go | 31 ++++++++++++++++++++++++------- main.go | 2 +- repository/repository.go | 4 ++-- test/unittest_util.go | 10 +++++----- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/container/container.go b/container/container.go index 13f16810..df5f5c5c 100644 --- a/container/container.go +++ b/container/container.go @@ -10,7 +10,7 @@ import ( type Container interface { GetRepository() repository.Repository GetConfig() *config.Config - GetLogger() *logger.Logger + GetLogger() logger.Logger GetEnv() string } @@ -18,12 +18,12 @@ type Container interface { type container struct { rep repository.Repository config *config.Config - logger *logger.Logger + logger logger.Logger env string } // NewContainer is constructor. -func NewContainer(rep repository.Repository, config *config.Config, logger *logger.Logger, env string) Container { +func NewContainer(rep repository.Repository, config *config.Config, logger logger.Logger, env string) Container { return &container{rep: rep, config: config, logger: logger, env: env} } @@ -38,7 +38,7 @@ func (c *container) GetConfig() *config.Config { } // GetLogger returns the object of logger. -func (c *container) GetLogger() *logger.Logger { +func (c *container) GetLogger() logger.Logger { return c.logger } diff --git a/logger/gormlogger.go b/logger/gormlogger.go index efd930db..23d21149 100644 --- a/logger/gormlogger.go +++ b/logger/gormlogger.go @@ -22,39 +22,39 @@ const ( ) // LogMode: The log level of gorm logger is overwrited by the log level of Zap logger. -func (l *Logger) LogMode(level gormLogger.LogLevel) gormLogger.Interface { +func (l *logger) LogMode(level gormLogger.LogLevel) gormLogger.Interface { return l } // Info prints a information log. -func (l *Logger) Info(ctx context.Context, msg string, data ...interface{}) { +func (l *logger) Info(ctx context.Context, msg string, data ...interface{}) { l.Zap.Infof(messageFormat, append([]interface{}{msg, gormUtils.FileWithLineNum()}, data...)...) } // Warn prints a warning log. -func (l *Logger) Warn(ctx context.Context, msg string, data ...interface{}) { +func (l *logger) Warn(ctx context.Context, msg string, data ...interface{}) { l.Zap.Warnf(messageFormat, append([]interface{}{msg, gormUtils.FileWithLineNum()}, data...)...) } // Error prints a error log. -func (l *Logger) Error(ctx context.Context, msg string, data ...interface{}) { +func (l *logger) Error(ctx context.Context, msg string, data ...interface{}) { l.Zap.Errorf(messageFormat, append([]interface{}{msg, gormUtils.FileWithLineNum()}, data...)...) } // Trace prints a trace log such as sql, source file and error. -func (l *Logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { +func (l *logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { elapsed := time.Since(begin) switch { case err != nil: sql, _ := fc() - l.Zap.Errorf(errorFormat, gormUtils.FileWithLineNum(), err, sql) + l.GetZapLogger().Errorf(errorFormat, gormUtils.FileWithLineNum(), err, sql) case elapsed > slowThreshold*time.Millisecond && slowThreshold*time.Millisecond != 0: sql, _ := fc() slowLog := fmt.Sprintf("SLOW SQL >= %v", slowThreshold) - l.Zap.Warnf(errorFormat, gormUtils.FileWithLineNum(), slowLog, sql) + l.GetZapLogger().Warnf(errorFormat, gormUtils.FileWithLineNum(), slowLog, sql) default: sql, _ := fc() - l.Zap.Debugf(sqlFormat, sql) + l.GetZapLogger().Debugf(sqlFormat, sql) } } diff --git a/logger/logger.go b/logger/logger.go index a7b645d0..4aae96d1 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -1,13 +1,16 @@ package logger import ( + "context" "fmt" "io/ioutil" "os" + "time" "go.uber.org/zap" "gopkg.in/natefinch/lumberjack.v2" "gopkg.in/yaml.v2" + gormLogger "gorm.io/gorm/logger" ) // Config represents the setting for zap logger. @@ -17,12 +20,26 @@ type Config struct { } // Logger is an alternative implementation of *gorm.Logger -type Logger struct { +type Logger interface { + GetZapLogger() *zap.SugaredLogger + LogMode(level gormLogger.LogLevel) gormLogger.Interface + Info(ctx context.Context, msg string, data ...interface{}) + Warn(ctx context.Context, msg string, data ...interface{}) + Error(ctx context.Context, msg string, data ...interface{}) + Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) +} + +type logger struct { Zap *zap.SugaredLogger } -// NewLogger create logger object for *gorm.DB from *echo.Logger -func NewLogger(env string) *Logger { +// NewLogger is constructor for logger +func NewLogger(sugar *zap.SugaredLogger) Logger { + return &logger{Zap: sugar} +} + +// InitLogger create logger object for *gorm.DB from *echo.Logger +func InitLogger(env string) Logger { configYaml, err := ioutil.ReadFile("./zaplogger." + env + ".yml") if err != nil { fmt.Printf("Failed to read logger configuration: %s", err) @@ -41,13 +58,13 @@ func NewLogger(env string) *Logger { } sugar := zap.Sugar() // set package varriable logger. - logger := &Logger{Zap: sugar} - logger.Zap.Infof("Success to read zap logger configuration: zaplogger." + env + ".yml") + log := NewLogger(sugar) + log.GetZapLogger().Infof("Success to read zap logger configuration: zaplogger." + env + ".yml") _ = zap.Sync() - return logger + return log } // GetZapLogger returns zapSugaredLogger -func (log *Logger) GetZapLogger() *zap.SugaredLogger { +func (log *logger) GetZapLogger() *zap.SugaredLogger { return log.Zap } diff --git a/main.go b/main.go index e7ba00cd..e7ad486e 100644 --- a/main.go +++ b/main.go @@ -24,7 +24,7 @@ func main() { e := echo.New() conf, env := config.Load() - logger := logger.NewLogger(env) + logger := logger.InitLogger(env) logger.GetZapLogger().Infof("Loaded this configuration : application." + env + ".yml") rep := repository.NewBookRepository(logger, conf) diff --git a/repository/repository.go b/repository/repository.go index 4712e1be..9e3be99f 100644 --- a/repository/repository.go +++ b/repository/repository.go @@ -46,7 +46,7 @@ type bookRepository struct { } // NewBookRepository is constructor for bookRepository. -func NewBookRepository(logger *logger.Logger, conf *config.Config) Repository { +func NewBookRepository(logger logger.Logger, conf *config.Config) Repository { logger.GetZapLogger().Infof("Try database connection") db, err := connectDatabase(logger, conf) if err != nil { @@ -66,7 +66,7 @@ const ( MYSQL = "mysql" ) -func connectDatabase(logger *logger.Logger, config *config.Config) (*gorm.DB, error) { +func connectDatabase(logger logger.Logger, config *config.Config) (*gorm.DB, error) { var dsn string gormConfig := &gorm.Config{Logger: logger} diff --git a/test/unittest_util.go b/test/unittest_util.go index 80ee1c17..ffe62ea5 100644 --- a/test/unittest_util.go +++ b/test/unittest_util.go @@ -75,13 +75,13 @@ func createConfig(isSecurity bool) *config.Config { return conf } -func initContainer(conf *config.Config, logger *logger.Logger) container.Container { +func initContainer(conf *config.Config, logger logger.Logger) container.Container { rep := repository.NewBookRepository(logger, conf) container := container.NewContainer(rep, conf, logger, "test") return container } -func initTestLogger() *logger.Logger { +func initTestLogger() logger.Logger { myConfig := createLoggerConfig() zap, err := myConfig.Build() if err != nil { @@ -89,18 +89,18 @@ func initTestLogger() *logger.Logger { } sugar := zap.Sugar() // set package varriable logger. - logger := &logger.Logger{Zap: sugar} + logger := logger.NewLogger(sugar) logger.GetZapLogger().Infof("Success to read zap logger configuration") _ = zap.Sync() return logger } -func initObservedLogger() (*logger.Logger, *observer.ObservedLogs) { +func initObservedLogger() (logger.Logger, *observer.ObservedLogs) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) sugar := zap.New(observedZapCore).Sugar() // set package varriable logger. - logger := &logger.Logger{Zap: sugar} + logger := logger.NewLogger(sugar) return logger, observedLogs }