Bläddra i källkod

cmd/serv: improve hookMode handling (#5960)

- Allow remove primary logger at better location
- Use more appropriate log.Error to replace log.Fatal
ᴜɴᴋɴᴡᴏɴ 4 år sedan
förälder
incheckning
931da04dc2
2 ändrade filer med 17 tillägg och 9 borttagningar
  1. 7 4
      internal/cmd/serv.go
  2. 10 5
      internal/conf/log.go

+ 7 - 4
internal/cmd/serv.go

@@ -35,14 +35,17 @@ var Serv = cli.Command{
 	},
 }
 
-func fail(userMessage, logMessage string, args ...interface{}) {
+// fail prints user message to the Git client (i.e. os.Stderr) and
+// 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)
 
-	if len(logMessage) > 0 {
+	if len(errMessage) > 0 {
 		if !conf.IsProdMode() {
-			fmt.Fprintf(os.Stderr, logMessage+"\n", args...)
+			fmt.Fprintf(os.Stderr, errMessage+"\n", args...)
 		}
-		log.Fatal(logMessage, args...)
+		log.Error(errMessage, args...)
 	}
 
 	os.Exit(1)

+ 10 - 5
internal/conf/log.go

@@ -126,17 +126,15 @@ func initLogConf(cfg *ini.File, hookMode bool) (_ *logConf, hasConsole bool, _ e
 }
 
 // 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.
+// "hookMode" is true, it only initializes the root path for log files without
+// creating any logger. It will also not remove the primary logger in "hookMode"
+// and is up to the caller to decide when to remove it.
 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
 	}()
 
@@ -177,4 +175,11 @@ func InitLogging(hookMode bool) {
 		}
 		log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String())))
 	}
+
+	// ⚠️ WARNING: It is only safe to remove the primary logger until
+	// there are other loggers that are initialized. Otherwise, the
+	// application will print errors to nowhere.
+	if !hasConsole {
+		log.Remove(log.DefaultConsoleName)
+	}
 }