From 45683cbc0df349d266678d19ed0fe055668d5c40 Mon Sep 17 00:00:00 2001 From: celogeek Date: Sat, 5 Feb 2022 18:39:26 +0100 Subject: [PATCH] log with prefix --- cmd/photos-api/main.go | 7 ++++--- internal/photos/api/db.go | 2 +- internal/photos/api/dump.go | 2 +- internal/photos/api/logger.go | 34 +++++++++++++++++++++++++++++++++ internal/photos/api/main.go | 23 +++++++++++++++------- internal/photos/api/recovery.go | 2 +- internal/photos/api/session.go | 17 ++++++++++++++++- internal/photos/models/photo.go | 6 ++++++ 8 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 internal/photos/api/logger.go create mode 100644 internal/photos/models/photo.go diff --git a/cmd/photos-api/main.go b/cmd/photos-api/main.go index 2c3a34f..8f572da 100644 --- a/cmd/photos-api/main.go +++ b/cmd/photos-api/main.go @@ -20,7 +20,6 @@ var ( mysqlUser = getEnv("MYSQL_USER", "photos") mysqlPassword = getEnv("MYSQL_PASSWD", "photos") mysqlDatabase = getEnv("MYSQL_DB", "photos") - logger = log.New(os.Stderr, "[Photos] ", log.LstdFlags) getEnvConfig = false getCurrentEnvConfig = false ) @@ -86,8 +85,10 @@ func main() { return } - if err := api.New(logger, config).Run(); err != nil { - logger.Fatal(err) + p := api.New(config) + + if err := p.Run(); err != nil { + log.Fatal(err) } } diff --git a/internal/photos/api/db.go b/internal/photos/api/db.go index bce2ff6..d2d926a 100644 --- a/internal/photos/api/db.go +++ b/internal/photos/api/db.go @@ -35,7 +35,7 @@ func (s *Service) DBConnect() { }) if err != nil { - s.Logger.Fatal(err) + s.LogErr.Fatal("DB", err) } s.DB = db diff --git a/internal/photos/api/dump.go b/internal/photos/api/dump.go index 1e9fd79..e45bbac 100644 --- a/internal/photos/api/dump.go +++ b/internal/photos/api/dump.go @@ -11,5 +11,5 @@ func (s *Service) Dump(o interface{}) { enc.SetIndent("", " ") enc.Encode(o) - s.Logger.Printf("%s", b.Bytes()) + s.LogOk.Printf("Dump", "%s", b.Bytes()) } diff --git a/internal/photos/api/logger.go b/internal/photos/api/logger.go new file mode 100644 index 0000000..20c3123 --- /dev/null +++ b/internal/photos/api/logger.go @@ -0,0 +1,34 @@ +package api + +import ( + "fmt" + "io" + "os" + "time" +) + +var logTimeFmt = "2006/01/02 - 15:04:05" + +type Logger struct { + out io.StringWriter + prefix string +} + +func (l *Logger) Print(prefix string, a ...interface{}) { + t := time.Now().UTC() + l.out.WriteString(fmt.Sprintf("[%s] %s | [%s] | %s\n", l.prefix, t.Format(logTimeFmt), prefix, fmt.Sprint(a...))) +} + +func (l *Logger) Printf(prefix string, format string, a ...interface{}) { + l.Print(prefix, fmt.Sprintf(format, a...)) +} + +func (l *Logger) Fatal(prefix string, a ...interface{}) { + l.Print(prefix, a...) + os.Exit(1) +} + +func (l *Logger) Fatalf(prefix string, format string, a ...interface{}) { + l.Printf(prefix, format, a...) + os.Exit(1) +} diff --git a/internal/photos/api/main.go b/internal/photos/api/main.go index 5ee5ae8..1878ee9 100644 --- a/internal/photos/api/main.go +++ b/internal/photos/api/main.go @@ -19,7 +19,8 @@ type Service struct { Gin *gin.Engine DB *gorm.DB Config *ServiceConfig - Logger *log.Logger + LogOk *Logger + LogErr *Logger GormLogger gormlogger.Interface } @@ -28,11 +29,12 @@ type ServiceConfig struct { Mysql *gomysql.Config } -func New(logger *log.Logger, config *ServiceConfig) *Service { +func New(config *ServiceConfig) *Service { return &Service{ Gin: gin.New(), Config: config, - Logger: logger, + LogOk: &Logger{os.Stdout, "Photos"}, + LogErr: &Logger{os.Stderr, "Photos"}, GormLogger: gormlogger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer gormlogger.Config{ @@ -55,16 +57,23 @@ func (s *Service) SetupRoutes() { ac.POST("/login", s.Login) ac.GET("/logout", s.RequireAuthToken, s.Logout) + s.Gin.GET("/me", s.RequireSession, func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "status": "success", + "user": s.CurrentSession(c).Account.Login, + }) + }) + s.Gin.NoRoute(func(c *gin.Context) { s.Error(c, http.StatusNotFound, ErrReqNotFound) }) - } func (s *Service) Run() error { rand.Seed(time.Now().UnixNano()) s.SetupRoutes() s.SetupDB() + go s.SessionCleaner() srv := &http.Server{ Addr: s.Config.Listen, @@ -84,7 +93,7 @@ func (s *Service) Run() error { // a timeout of 5 seconds. signal.Notify(quit, os.Interrupt) <-quit - s.Logger.Print("shutdown ...") + s.LogOk.Print("Exit", "shutdown ...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -96,11 +105,11 @@ func (s *Service) Run() error { if err != nil { return err } - s.Logger.Print("closing database ...") + s.LogOk.Print("Exit", "closing database ...") if err := db.Close(); err != nil { return err } - s.Logger.Print("exiting") + s.LogOk.Print("Exit", "exiting") return runError } diff --git a/internal/photos/api/recovery.go b/internal/photos/api/recovery.go index 505abe4..508ddd5 100644 --- a/internal/photos/api/recovery.go +++ b/internal/photos/api/recovery.go @@ -9,7 +9,7 @@ import ( func (s *Service) Recovery(c *gin.Context) { defer func() { if err := recover(); err != nil { - s.Logger.Print("[PANIC]", err) + s.LogErr.Print("PANIC", err) s.Error(c, http.StatusInternalServerError, ErrUnexpected) } }() diff --git a/internal/photos/api/session.go b/internal/photos/api/session.go index 3fc2e6e..2f15f61 100644 --- a/internal/photos/api/session.go +++ b/internal/photos/api/session.go @@ -4,6 +4,7 @@ import ( "errors" "net/http" "strings" + "time" "github.com/gin-gonic/gin" "gitlab.celogeek.com/photos/api/internal/photos/models" @@ -40,6 +41,20 @@ func (s *Service) RequireSession(c *gin.Context) { return } s.DB.Select("updated_at").Save(sess) - s.Logger.Printf("User: %s", sess.Account.Login) + s.LogOk.Printf("Session", "User: %s", sess.Account.Login) c.Set("session", sess) } + +func (s *Service) CurrentSession(c *gin.Context) *models.Session { + return c.MustGet("session").(*models.Session) +} + +func (s *Service) SessionCleaner() { + for range time.Tick(time.Minute) { + t := time.Now().UTC().Add(-3 * time.Hour).Truncate(time.Minute) + s.LogOk.Printf("Session", "Cleaning old session < %s", t) + if err := s.DB.Where("updated_at < ?", t).Delete(&models.Session{}).Error; err != nil { + s.LogErr.Printf("Session", "Cleaning failed: %s", err) + } + } +} diff --git a/internal/photos/models/photo.go b/internal/photos/models/photo.go new file mode 100644 index 0000000..d74b6b0 --- /dev/null +++ b/internal/photos/models/photo.go @@ -0,0 +1,6 @@ +package models + +type Photo struct { + ID uint32 `gorm:"primary_key"` + File string +}