diff --git a/internal/cmd/serv.go b/internal/cmd/serv.go index 0efb139bf..3478b7204 100644 --- a/internal/cmd/serv.go +++ b/internal/cmd/serv.go @@ -49,6 +49,8 @@ func fail(userMessage, logMessage string, args ...interface{}) { } func setup(c *cli.Context, logPath string, connectDB bool) { + conf.HookMode = true + var customConf string if c.IsSet("config") { customConf = c.String("config") @@ -60,6 +62,7 @@ func setup(c *cli.Context, logPath string, connectDB bool) { if err != nil { fail("Internal error", "Failed to init configuration: %v", err) } + conf.InitLogging(true) level := log.LevelTrace if conf.IsProdMode() { diff --git a/internal/conf/log.go b/internal/conf/log.go index 3087c7c86..58e17f871 100644 --- a/internal/conf/log.go +++ b/internal/conf/log.go @@ -28,12 +28,19 @@ type logConf struct { // Log settings var Log *logConf -// initLogConf returns parsed logging configuration from given INI file. +// initLogConf returns parsed logging configuration from given INI file. When the +// argument "hookMode" is true, it only initializes the root path for log files. // NOTE: Because we always create a console logger as the primary logger at init time, // we need to remove it in case the user doesn't configure to use it after the logging // service is initalized. -func initLogConf(cfg *ini.File) (_ *logConf, hasConsole bool, _ error) { +func initLogConf(cfg *ini.File, hookMode bool) (_ *logConf, hasConsole bool, _ error) { rootPath := cfg.Section("log").Key("ROOT_PATH").MustString(filepath.Join(WorkDir(), "log")) + if hookMode { + return &logConf{ + RootPath: ensureAbs(rootPath), + }, false, nil + } + modes := strings.Split(cfg.Section("log").Key("MODE").MustString("console"), ",") lc := &logConf{ RootPath: ensureAbs(rootPath), @@ -118,12 +125,24 @@ func initLogConf(cfg *ini.File) (_ *logConf, hasConsole bool, _ error) { return lc, hasConsole, nil } -// InitLogging initializes the logging service of the application. -func InitLogging() { - logConf, hasConsole, err := initLogConf(File) +// InitLogging initializes the logging service of the application. When the +// argument "hookMode" is true, it only initializes the root path for log files +// without creating any logger. +func InitLogging(hookMode bool) { + logConf, hasConsole, err := initLogConf(File, hookMode) if err != nil { log.Fatal("Failed to init logging configuration: %v", err) } + defer func() { + if !hasConsole { + log.Remove(log.DefaultConsoleName) + } + Log = logConf + }() + + if hookMode { + return + } err = os.MkdirAll(logConf.RootPath, os.ModePerm) if err != nil { @@ -158,10 +177,4 @@ func InitLogging() { } log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String()))) } - - if !hasConsole { - log.Remove(log.DefaultConsoleName) - } - - Log = logConf } diff --git a/internal/conf/static.go b/internal/conf/static.go index acd91fc27..351cbdd44 100644 --- a/internal/conf/static.go +++ b/internal/conf/static.go @@ -492,6 +492,8 @@ func handleDeprecated() { // HookMode indicates whether program starts as Git server-side hook callback. // All operations should be done synchronously to prevent program exits before finishing. +// +// ⚠️ WARNING: Should only be set by "internal/cmd/serv.go". var HookMode bool // Indicates which database backend is currently being used. diff --git a/internal/route/install.go b/internal/route/install.go index e14a60aa9..e3d0555bc 100644 --- a/internal/route/install.go +++ b/internal/route/install.go @@ -54,7 +54,7 @@ func GlobalInit(customConf string) error { return errors.Wrap(err, "init configuration") } - conf.InitLogging() + conf.InitLogging(false) log.Info("%s %s", conf.App.BrandName, conf.App.Version) log.Trace("Work directory: %s", conf.WorkDir()) log.Trace("Custom path: %s", conf.CustomDir())