From 891be34504da388d5853e5c68a49914f2011867c Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Thu, 25 Jul 2024 20:28:13 +0800 Subject: [PATCH] feat: log to file --- go.mod | 4 +++- go.sum | 4 ++++ log/log.go | 40 ++++++++++++++++++++++++++++++++++++---- server/resources.go | 5 ----- server/server.go | 8 +++++++- server/setting.go | 13 +++++++++++++ 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index ffbb66d..a483c20 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,8 @@ require ( require github.com/adrg/strutil v0.3.1 +require github.com/gin-contrib/zap v1.1.3 // indirect + require ( ariga.io/atlas v0.19.1-0.20240203083654-5948b60a8e43 // indirect github.com/agext/levenshtein v1.2.1 // indirect @@ -74,5 +76,5 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pkg/errors v0.9.1 github.com/spf13/viper v1.19.0 - go.uber.org/multierr v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 3b9916a..deb1548 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-contrib/static v1.1.2 h1:c3kT4bFkUJn2aoRU3s6XnMjJT8J6nNWJkR0NglqmlZ4= github.com/gin-contrib/static v1.1.2/go.mod h1:Fw90ozjHCmZBWbgrsqrDvO28YbhKEKzKp8GixhR4yLw= +github.com/gin-contrib/zap v1.1.3 h1:9e/U9fYd4/OBfmSEBs5hHZq114uACn7bpuzvCkcJySA= +github.com/gin-contrib/zap v1.1.3/go.mod h1:+BD/6NYZKJyUpqVoJEvgeq9GLz8pINEQvak9LHNOTSE= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= @@ -155,6 +157,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 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/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.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= diff --git a/log/log.go b/log/log.go index 628d668..539cee2 100644 --- a/log/log.go +++ b/log/log.go @@ -1,18 +1,50 @@ package log import ( + "path/filepath" + "strings" + "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var sugar *zap.SugaredLogger +var atom zap.AtomicLevel + +const dataPath = "./data" func init() { - config := zap.NewDevelopmentConfig() - config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder - config.DisableStacktrace = true - logger, _ := config.Build(zap.AddCallerSkip(1)) + atom = zap.NewAtomicLevel() + + filer, _, err := zap.Open(filepath.Join(dataPath, "polaris.log")) + if err != nil { + panic(err) + } + consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + + logger := zap.New(zapcore.NewCore(consoleEncoder, zapcore.Lock(filer), atom), zap.AddCallerSkip(1)) + sugar = logger.Sugar() + +} + + + +func SetLogLevel(l string) { + switch strings.TrimSpace(strings.ToLower(l)) { + case "debug": + atom.SetLevel(zap.DebugLevel) + case "info": + atom.SetLevel(zap.InfoLevel) + case "warn", "warnning": + atom.SetLevel(zap.WarnLevel) + case "error": + atom.SetLevel(zap.ErrorLevel) + } +} + +func Logger() *zap.SugaredLogger { + return sugar } func Info(args ...interface{}) { diff --git a/server/resources.go b/server/resources.go index 81c4159..5325896 100644 --- a/server/resources.go +++ b/server/resources.go @@ -195,11 +195,6 @@ func (s *Server) SearchAvailableMovies(c *gin.Context) (interface{}, error) { return nil, errors.Wrap(err, "convert") } - movieDetail := s.db.GetMediaDetails(id) - if movieDetail == nil { - return nil, errors.New("no media found of id " + ids) - } - res, err := core.SearchMovie(s.db, id, false) if err != nil { if err.Error() == "no resource found" { diff --git a/server/server.go b/server/server.go index c16ae0a..ab44fae 100644 --- a/server/server.go +++ b/server/server.go @@ -10,6 +10,9 @@ import ( "polaris/pkg/tmdb" "polaris/pkg/transmission" "polaris/ui" + "time" + + ginzap "github.com/gin-contrib/zap" "github.com/gin-contrib/static" "github.com/robfig/cron" @@ -43,6 +46,8 @@ func (s *Server) Serve() error { s.jwtSerect = s.db.GetSetting(db.JwtSerectKey) //st, _ := fs.Sub(ui.Web, "build/web") s.r.Use(static.Serve("/", static.EmbedFolder(ui.Web, "build/web"))) + s.r.Use(ginzap.Ginzap(log.Logger().Desugar(), time.RFC3339, false)) + s.r.Use(ginzap.RecoveryWithZap(log.Logger().Desugar(), true)) s.r.POST("/api/login", HttpHandler(s.Login)) @@ -57,6 +62,7 @@ func (s *Server) Serve() error { setting.GET("/general", HttpHandler(s.GetSetting)) setting.POST("/auth", HttpHandler(s.EnableAuth)) setting.GET("/auth", HttpHandler(s.GetAuthSetting)) + setting.POST("/loglevel", HttpHandler(s.SetLogLevel)) } activity := api.Group("/activity") { @@ -146,7 +152,7 @@ func (s *Server) proxyPosters(c *gin.Context) { req.Host = remote.Host req.URL.Scheme = remote.Scheme req.URL.Host = remote.Host - req.URL.Path = fmt.Sprintf("/t/p/w500/%v", c.Param("proxyPath")) + req.URL.Path = fmt.Sprintf("/t/p/w500/%v", c.Param("proxyPath")) } proxy.ServeHTTP(c.Writer, c.Request) } diff --git a/server/setting.go b/server/setting.go index 675eabf..fbf256c 100644 --- a/server/setting.go +++ b/server/setting.go @@ -143,3 +143,16 @@ func (s *Server) DeleteDownloadCLient(c *gin.Context) (interface{}, error) { s.db.DeleteDownloadCLient(id) return "success", nil } + +type logLovelIn struct { + Level string `json:"level"` +} + +func (s *Server) SetLogLevel(c *gin.Context) (interface{}, error) { + var in logLovelIn + if err := c.ShouldBindJSON(&in); err != nil { + return nil, errors.Wrap(err, "bind json") + } + log.SetLogLevel(in.Level) + return "success", nil +} \ No newline at end of file