Преглед изворни кода

cmd: init minimal logging config in hook mode

ᴜɴᴋɴᴡᴏɴ пре 4 година
родитељ
комит
7382c23a17
4 измењених фајлова са 30 додато и 12 уклоњено
  1. 3 0
      internal/cmd/serv.go
  2. 24 11
      internal/conf/log.go
  3. 2 0
      internal/conf/static.go
  4. 1 1
      internal/route/install.go

+ 3 - 0
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() {

+ 24 - 11
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
 }

+ 2 - 0
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.

+ 1 - 1
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())