diff options
author | ᴜɴᴋɴᴡᴏɴ <u@gogs.io> | 2020-09-29 22:26:07 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-29 22:26:07 +0800 |
commit | 7bc3ee49aa317e48331cf6e39e1911ac89b2e325 (patch) | |
tree | 8d5a515c79061e67f2164e696c189a8d99ce0fcd /internal | |
parent | 8fc40132401747dbd2a39dbb6869eb1652a2f882 (diff) |
cmd/serv: use different log files for ORMs in hook mode (#6361)
Diffstat (limited to 'internal')
-rw-r--r-- | internal/cmd/hook.go | 6 | ||||
-rw-r--r-- | internal/cmd/serv.go | 7 | ||||
-rw-r--r-- | internal/db/db.go | 7 | ||||
-rw-r--r-- | internal/db/models.go | 33 |
4 files changed, 34 insertions, 19 deletions
diff --git a/internal/cmd/hook.go b/internal/cmd/hook.go index 9b4e2278..99a5e15b 100644 --- a/internal/cmd/hook.go +++ b/internal/cmd/hook.go @@ -66,7 +66,7 @@ func runHookPreReceive(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil } - setup(c, "hooks/pre-receive.log", true) + setup(c, "pre-receive.log", true) isWiki := strings.Contains(os.Getenv(db.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/") @@ -159,7 +159,7 @@ func runHookUpdate(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil } - setup(c, "hooks/update.log", false) + setup(c, "update.log", false) args := c.Args() if len(args) != 3 { @@ -193,7 +193,7 @@ func runHookPostReceive(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil } - setup(c, "hooks/post-receive.log", true) + setup(c, "post-receive.log", true) // Post-receive hook does more than just gather Git information, // so we need to setup additional services for email notifications. diff --git a/internal/cmd/serv.go b/internal/cmd/serv.go index 4c9bb4ca..06d78a6d 100644 --- a/internal/cmd/serv.go +++ b/internal/cmd/serv.go @@ -38,7 +38,7 @@ var Serv = cli.Command{ // logs error message on the server side. When not in "prod" mode, // error message is also printed to the client for easier debugging. func fail(userMessage, errMessage string, args ...interface{}) { - fmt.Fprintln(os.Stderr, "Gogs:", userMessage) + _, _ = fmt.Fprintln(os.Stderr, "Gogs:", userMessage) if len(errMessage) > 0 { if !conf.IsProdMode() { @@ -47,10 +47,11 @@ func fail(userMessage, errMessage string, args ...interface{}) { log.Error(errMessage, args...) } + log.Stop() os.Exit(1) } -func setup(c *cli.Context, logPath string, connectDB bool) { +func setup(c *cli.Context, logFile string, connectDB bool) { conf.HookMode = true var customConf string @@ -73,7 +74,7 @@ func setup(c *cli.Context, logPath string, connectDB bool) { err = log.NewFile(log.FileConfig{ Level: level, - Filename: filepath.Join(conf.Log.RootPath, logPath), + Filename: filepath.Join(conf.Log.RootPath, "hooks", logFile), FileRotationConfig: log.FileRotationConfig{ Rotate: true, Daily: true, diff --git a/internal/db/db.go b/internal/db/db.go index c3e3f19a..7f82c43f 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -145,12 +145,7 @@ var Tables = []interface{}{ new(LFSObject), new(LoginSource), } -func Init() (*gorm.DB, error) { - w, err := newLogWriter() - if err != nil { - return nil, errors.Wrap(err, "new log writer") - } - +func Init(w logger.Writer) (*gorm.DB, error) { level := logger.Info if conf.IsProdMode() { level = logger.Warn diff --git a/internal/db/models.go b/internal/db/models.go index 52ef4495..ac9cbe32 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -10,16 +10,20 @@ import ( "net/url" "os" "path" + "path/filepath" "strings" "time" + "github.com/pkg/errors" "gorm.io/gorm" + "gorm.io/gorm/logger" log "unknwon.dev/clog/v2" "xorm.io/core" "xorm.io/xorm" "gogs.io/gogs/internal/conf" "gogs.io/gogs/internal/db/migrations" + "gogs.io/gogs/internal/dbutil" ) // Engine represents a XORM engine or session. @@ -132,16 +136,21 @@ func SetEngine() (*gorm.DB, error) { x.SetMapper(core.GonicMapper{}) - // WARNING: for serv command, MUST remove the output to os.stdout, - // so use log file to instead print to stdout. + var logPath string + if conf.HookMode { + logPath = filepath.Join(conf.Log.RootPath, "hooks", "xorm.log") + } else { + logPath = filepath.Join(conf.Log.RootPath, "xorm.log") + } sec := conf.File.Section("log.xorm") - logger, err := log.NewFileWriter(path.Join(conf.Log.RootPath, "xorm.log"), + fileWriter, err := log.NewFileWriter(logPath, log.FileRotationConfig{ Rotate: sec.Key("ROTATE").MustBool(true), Daily: sec.Key("ROTATE_DAILY").MustBool(true), MaxSize: sec.Key("MAX_SIZE").MustInt64(100) * 1024 * 1024, MaxDays: sec.Key("MAX_DAYS").MustInt64(3), - }) + }, + ) if err != nil { return nil, fmt.Errorf("create 'xorm.log': %v", err) } @@ -151,12 +160,22 @@ func SetEngine() (*gorm.DB, error) { x.SetConnMaxLifetime(time.Second) if conf.IsProdMode() { - x.SetLogger(xorm.NewSimpleLogger3(logger, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING)) + x.SetLogger(xorm.NewSimpleLogger3(fileWriter, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING)) } else { - x.SetLogger(xorm.NewSimpleLogger(logger)) + x.SetLogger(xorm.NewSimpleLogger(fileWriter)) } x.ShowSQL(true) - return Init() + + var gormLogger logger.Writer + if conf.HookMode { + gormLogger = &dbutil.Logger{Writer: fileWriter} + } else { + gormLogger, err = newLogWriter() + if err != nil { + return nil, errors.Wrap(err, "new log writer") + } + } + return Init(gormLogger) } func NewEngine() (err error) { |