feat(log): tee logs to file and stdout (#42)

This commit is contained in:
Hexxa 2021-03-06 10:44:24 +08:00 committed by GitHub
parent 6bd8d2422b
commit 9b2157ac6a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 98 additions and 22 deletions

View file

@ -2,6 +2,7 @@ package depidx
import (
"github.com/ihexxa/gocfg"
"go.uber.org/zap"
"github.com/ihexxa/quickshare/src/cryptoutil"
"github.com/ihexxa/quickshare/src/fs"
@ -23,6 +24,7 @@ type Deps struct {
kv kvstore.IKVStore
uploader IUploader
id idgen.IIDGen
logger *zap.SugaredLogger
}
func NewDeps(cfg gocfg.ICfg) *Deps {
@ -60,3 +62,11 @@ func (deps *Deps) ID() idgen.IIDGen {
func (deps *Deps) SetID(ider idgen.IIDGen) {
deps.id = ider
}
func (deps *Deps) Log() *zap.SugaredLogger {
return deps.logger
}
func (deps *Deps) SetLog(logger *zap.SugaredLogger) {
deps.logger = logger
}

View file

@ -82,11 +82,11 @@ func (lk *AutoLocker) Exec(handler func()) {
defer func() {
if p := recover(); p != nil {
fmt.Println(p)
lk.h.deps.Log().Error(p)
}
if locked {
if err = kv.Unlock(lk.key); err != nil {
fmt.Println(err)
lk.h.deps.Log().Error(err)
}
}
}()

View file

@ -8,11 +8,15 @@ import (
"fmt"
"net/http"
"os"
"path/filepath"
"time"
"github.com/gin-contrib/static"
"github.com/gin-gonic/gin"
"github.com/ihexxa/gocfg"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"github.com/ihexxa/quickshare/src/cryptoutil/jwt"
"github.com/ihexxa/quickshare/src/depidx"
@ -28,16 +32,16 @@ import (
type Server struct {
server *http.Server
cfg gocfg.ICfg
deps *depidx.Deps
}
func NewServer(cfg gocfg.ICfg) (*Server, error) {
deps := initDeps(cfg)
if !cfg.BoolOr("Server.Debug", false) {
gin.SetMode(gin.ReleaseMode)
}
deps := initDeps(cfg)
router := gin.Default()
router, err := initHandlers(router, cfg, deps)
if err != nil {
@ -55,6 +59,7 @@ func NewServer(cfg gocfg.ICfg) (*Server, error) {
return &Server{
server: srv,
deps: deps,
cfg: cfg,
}, nil
}
@ -75,10 +80,12 @@ func mkRoot(rootPath string) {
}
func initDeps(cfg gocfg.ICfg) *depidx.Deps {
logger := initLogger(cfg)
secret, ok := cfg.String("ENV.TOKENSECRET")
if !ok {
secret = makeRandToken()
fmt.Println("warning: TOKENSECRET is not given, using generated token")
logger.Info("warning: TOKENSECRET is not given, using generated token")
}
rootPath := cfg.GrabString("Fs.Root")
@ -96,6 +103,7 @@ func initDeps(cfg gocfg.ICfg) *depidx.Deps {
deps.SetToken(jwtEncDec)
deps.SetKV(kv)
deps.SetID(ider)
deps.SetLog(logger)
return deps
}
@ -109,7 +117,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E
adminName, ok := cfg.String("ENV.DEFAULTADMIN")
if !ok || adminName == "" {
// only write to stdout
fmt.Print("Please input admin name: ")
deps.Log().Info("Please input admin name: ")
fmt.Scanf("%s", &adminName)
}
@ -127,7 +135,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E
return nil, err
}
fmt.Printf("user (%s) is created\n", adminName)
deps.Log().Info("user (%s) is created\n", adminName)
}
fileHdrs, err := fileshdr.NewFileHandlers(cfg, deps)
@ -183,7 +191,36 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E
return router, nil
}
func initLogger(cfg gocfg.ICfg) *zap.SugaredLogger {
fileWriter := zapcore.AddSync(&lumberjack.Logger{
Filename: filepath.Join(cfg.GrabString("Fs.Root"), "quickshare.log"),
MaxSize: cfg.IntOr("Log.MaxSize", 50), // megabytes
MaxBackups: cfg.IntOr("Log.MaxBackups", 2),
MaxAge: cfg.IntOr("Log.MaxAge", 31), // days
})
stdoutWriter := zapcore.AddSync(os.Stdout)
multiWriter := zapcore.NewMultiWriteSyncer(fileWriter, stdoutWriter)
gin.DefaultWriter = multiWriter
core := zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
multiWriter,
zap.InfoLevel,
)
return zap.New(core).Sugar()
}
func (s *Server) Start() error {
s.deps.Log().Infow(
"quickshare is starting",
"hostname:port",
fmt.Sprintf(
"%s:%d",
s.cfg.GrabString("Server.Host"),
s.cfg.GrabInt("Server.Port"),
),
)
err := s.server.ListenAndServe()
if err != http.ErrServerClosed {
return err
@ -193,6 +230,7 @@ func (s *Server) Start() error {
func (s *Server) Shutdown() error {
// TODO: add timeout
s.deps.Log().Sync()
return s.server.Shutdown(context.Background())
}