diff --git a/server/go.mod b/server/go.mod index e7c1592..2cc6893 100644 --- a/server/go.mod +++ b/server/go.mod @@ -14,6 +14,8 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/natefinch/lumberjack v2.0.0+incompatible + github.com/natefinch/lumberjack/v3 v3.0.0-alpha // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect @@ -21,6 +23,8 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.16.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect diff --git a/server/go.sum b/server/go.sum index 814829c..cb2565c 100644 --- a/server/go.sum +++ b/server/go.sum @@ -140,6 +140,10 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= +github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= +github.com/natefinch/lumberjack/v3 v3.0.0-alpha h1:HZ2AJF20D1lo9S0F/rpgkFbPGam5dgR3X0KUtZA5mlY= +github.com/natefinch/lumberjack/v3 v3.0.0-alpha/go.mod h1:rPTlHhMjhrvPAhqKh0FC57E0pXZoanrXgMDj4yv5wcM= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -179,6 +183,10 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.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= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/server/server.go b/server/server.go index 7d47873..d82d221 100644 --- a/server/server.go +++ b/server/server.go @@ -14,15 +14,21 @@ import ( "recipe-manager/data" "recipe-manager/models" "recipe-manager/routers" + "recipe-manager/services/logger" "recipe-manager/services/oauth" "strings" "github.com/go-chi/chi/v5" "github.com/go-chi/cors" "github.com/spf13/viper" + "go.uber.org/zap" "golang.org/x/oauth2" ) +var ( + Log = logger.GetInstance() +) + func loadConfig(path string) (*config.ServerConfig, error) { viper.AddConfigPath(path) viper.SetConfigName("app") @@ -69,8 +75,12 @@ func NewServer() *Server { func (s *Server) Run() error { + // logger + // defer log_inst.Sync() + s.createHandler() log.Printf("Server running on %s", s.server.Addr) + Log.Info("Server running", zap.String("addr", s.server.Addr)) return s.server.ListenAndServe() } @@ -124,6 +134,9 @@ func (s *Server) createHandler() { } ctx := context.WithValue(r.Context(), "user", user) + + Log.Info("User is authenticated", zap.String("user", user.Name)) + next.ServeHTTP(w, r.WithContext(ctx)) }) }) diff --git a/server/services/logger/logger.go b/server/services/logger/logger.go new file mode 100644 index 0000000..cf4597f --- /dev/null +++ b/server/services/logger/logger.go @@ -0,0 +1,57 @@ +package logger + +import ( + "os" + + "github.com/natefinch/lumberjack" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +var ( + log_inst = NewLogger() + log_file_config = zapcore.AddSync(&lumberjack.Logger{ + Filename: "services/logger/serverlog.log", + MaxSize: 500, // megabytes + MaxBackups: 3, + MaxAge: 28, //days + }) + json_enc = zapcore.NewJSONEncoder(zapcore.EncoderConfig{ + TimeKey: "timestamp", + LevelKey: "level", + NameKey: "logger", + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + }) + console_enc = zapcore.NewConsoleEncoder(zapcore.EncoderConfig{ + TimeKey: "timestamp", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "message", + StacktraceKey: "error", + EncodeLevel: zapcore.CapitalColorLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + }) +) + +func createLogggerConfig() *zap.Logger { + log_level := zap.NewAtomicLevelAt(zap.InfoLevel) + + log_core := zapcore.NewTee( + zapcore.NewCore(json_enc, log_file_config, log_level), + zapcore.NewCore(console_enc, zapcore.AddSync(os.Stdout), log_level), + ) + + return zap.New(log_core) +} + +func NewLogger() *zap.Logger { + log := createLogggerConfig() + defer log.Sync() + return log +} + +func GetInstance() *zap.Logger { + return log_inst +} diff --git a/server/services/logger/serverlog.log b/server/services/logger/serverlog.log new file mode 100644 index 0000000..23b77c3 --- /dev/null +++ b/server/services/logger/serverlog.log @@ -0,0 +1,6 @@ +{"level":"info","timestamp":"2023-09-22T10:58:35.135+0700","addr":":8080"} +{"level":"info","timestamp":"2023-09-22T10:58:47.594+0700","user":"pakin tadatanasakul"} +{"level":"info","timestamp":"2023-09-22T10:59:55.661+0700","user":"pakin tadatanasakul"} +{"level":"info","timestamp":"2023-09-22T10:59:59.995+0700","user":"pakin tadatanasakul"} +{"level":"info","timestamp":"2023-09-22T11:00:00.056+0700","user":"pakin tadatanasakul"} +{"level":"info","timestamp":"2023-09-22T11:00:07.558+0700","user":"pakin tadatanasakul"}