summaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2023-06-28 17:35:20 +0800
committerGitHub <noreply@github.com>2023-06-28 17:35:20 +0800
commit0eb4ab4246f343f9a864023801af1ef028196f66 (patch)
treeea7345ebc41dc33c65fa77a9e82d5ede50d406e8 /cmd
parent102dcfa3a0a91b1d9cc868c78967784dd44e385b (diff)
downloadgitea-0eb4ab4246f343f9a864023801af1ef028196f66.tar.gz
gitea-0eb4ab4246f343f9a864023801af1ef028196f66.zip
Fix sub-command log level (#25537) (#25553)
Backport #25537 More fix for #24981 * #24981 Close #22361, #25552 * #22361 * #25552 There were many patches for Gitea's sub-commands to satisfy the facts: * Some sub-commands shouldn't output any log, otherwise the git protocol would be broken * Sometimes the users want to see "verbose" or "quiet" outputs That's a longstanding problem, and very fragile. This PR is only a quick patch for the problem. In the future, the sub-command system should be refactored to a clear solution. ---- Other changes: * Use `ReplaceAllWriters` to replace `RemoveAllWriters().AddWriters(writer)`, then it's an atomic operation. * Remove unnecessary `syncLevelInternal` calls, because `AddWriters/addWritersInternal` already calls it.
Diffstat (limited to 'cmd')
-rw-r--r--cmd/cmd.go18
-rw-r--r--cmd/doctor.go2
-rw-r--r--cmd/hook.go2
-rw-r--r--cmd/keys.go2
-rw-r--r--cmd/serv.go1
-rw-r--r--cmd/web.go6
6 files changed, 24 insertions, 7 deletions
diff --git a/cmd/cmd.go b/cmd/cmd.go
index 8076acecaa..4ed636a9b4 100644
--- a/cmd/cmd.go
+++ b/cmd/cmd.go
@@ -106,5 +106,21 @@ func setupConsoleLogger(level log.Level, colorize bool, out io.Writer) {
WriterOption: log.WriterConsoleOption{Stderr: out == os.Stderr},
}
writer := log.NewEventWriterConsole("console-default", writeMode)
- log.GetManager().GetLogger(log.DEFAULT).RemoveAllWriters().AddWriters(writer)
+ log.GetManager().GetLogger(log.DEFAULT).ReplaceAllWriters(writer)
+}
+
+// PrepareConsoleLoggerLevel by default, use INFO level for console logger, but some sub-commands (for git/ssh protocol) shouldn't output any log to stdout.
+// Any log appears in git stdout pipe will break the git protocol, eg: client can't push and hangs forever.
+func PrepareConsoleLoggerLevel(defaultLevel log.Level) func(*cli.Context) error {
+ return func(c *cli.Context) error {
+ level := defaultLevel
+ if c.Bool("quiet") || c.GlobalBoolT("quiet") {
+ level = log.FATAL
+ }
+ if c.Bool("debug") || c.GlobalBool("debug") || c.Bool("verbose") || c.GlobalBool("verbose") {
+ level = log.TRACE
+ }
+ log.SetConsoleLogger(log.DEFAULT, "console-default", level)
+ return nil
+ }
}
diff --git a/cmd/doctor.go b/cmd/doctor.go
index b79436fc0a..cd5f125e20 100644
--- a/cmd/doctor.go
+++ b/cmd/doctor.go
@@ -151,7 +151,7 @@ func setupDoctorDefaultLogger(ctx *cli.Context, colorize bool) {
log.FallbackErrorf("unable to create file log writer: %v", err)
return
}
- log.GetManager().GetLogger(log.DEFAULT).RemoveAllWriters().AddWriters(writer)
+ log.GetManager().GetLogger(log.DEFAULT).ReplaceAllWriters(writer)
}
}
diff --git a/cmd/hook.go b/cmd/hook.go
index 6453267832..ed6efc19ea 100644
--- a/cmd/hook.go
+++ b/cmd/hook.go
@@ -15,6 +15,7 @@ import (
"time"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
@@ -32,6 +33,7 @@ var (
Name: "hook",
Usage: "Delegate commands to corresponding Git hooks",
Description: "This should only be called by Git",
+ Before: PrepareConsoleLoggerLevel(log.FATAL),
Subcommands: []cli.Command{
subcmdHookPreReceive,
subcmdHookUpdate,
diff --git a/cmd/keys.go b/cmd/keys.go
index deb94fca5d..8aeee37527 100644
--- a/cmd/keys.go
+++ b/cmd/keys.go
@@ -8,6 +8,7 @@ import (
"fmt"
"strings"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
"github.com/urfave/cli"
@@ -17,6 +18,7 @@ import (
var CmdKeys = cli.Command{
Name: "keys",
Usage: "This command queries the Gitea database to get the authorized command for a given ssh key fingerprint",
+ Before: PrepareConsoleLoggerLevel(log.FATAL),
Action: runKeys,
Flags: []cli.Flag{
cli.StringFlag{
diff --git a/cmd/serv.go b/cmd/serv.go
index 01102d3800..79052e58a8 100644
--- a/cmd/serv.go
+++ b/cmd/serv.go
@@ -44,6 +44,7 @@ var CmdServ = cli.Command{
Name: "serv",
Usage: "This command should only be called by SSH shell",
Description: "Serv provides access auth for repositories",
+ Before: PrepareConsoleLoggerLevel(log.FATAL),
Action: runServ,
Flags: []cli.Flag{
cli.BoolFlag{
diff --git a/cmd/web.go b/cmd/web.go
index 8eb08120c7..53219c3dec 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -35,6 +35,7 @@ var CmdWeb = cli.Command{
Usage: "Start Gitea web server",
Description: `Gitea web server is the only thing you need to run,
and it takes care of all the other things for you`,
+ Before: PrepareConsoleLoggerLevel(log.INFO),
Action: runWeb,
Flags: []cli.Flag{
cli.StringFlag{
@@ -206,11 +207,6 @@ func servePprof() {
}
func runWeb(ctx *cli.Context) error {
- if ctx.Bool("verbose") {
- setupConsoleLogger(log.TRACE, log.CanColorStdout, os.Stdout)
- } else if ctx.Bool("quiet") {
- setupConsoleLogger(log.FATAL, log.CanColorStdout, os.Stdout)
- }
defer func() {
if panicked := recover(); panicked != nil {
log.Fatal("PANIC: %v\n%s", panicked, log.Stack(2))