fix: redirect early CLI console logger to stderr (#37507)
When running `gitea dump` with output routed to stdout (--file -),
deprecation warnings from loadAvatarsFrom were written to stdout,
corrupting the archive stream.
Root cause: PrepareConsoleLoggerLevel (called in app.Before) sets up a
console logger via SetConsoleLogger, which used WriterConsoleOption{}
defaulting Stderr to false (i.e. stdout). This logger is installed
before the dump subcommand can redirect logging to stderr in runDump.
Fix: use WriterConsoleOption{Stderr: true} in SetConsoleLogger so all
early CLI diagnostic output goes to stderr from the start. This is
correct for all subcommands — diagnostic/log output should never pollute
stdout.
---------
Signed-off-by: wxiaoguang <wxiaoguang@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Co-authored-by: Nicolas <bircni@icloud.com>
This commit is contained in:
@@ -134,7 +134,7 @@ func PrepareConsoleLoggerLevel(defaultLevel log.Level) func(context.Context, *cl
|
|||||||
if globalBool(c, "debug") || globalBool(c, "verbose") {
|
if globalBool(c, "debug") || globalBool(c, "verbose") {
|
||||||
level = log.TRACE
|
level = log.TRACE
|
||||||
}
|
}
|
||||||
log.SetConsoleLogger(log.DEFAULT, "console-default", level)
|
log.SetupStderrLogger(log.DEFAULT, "console-stderr", level)
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,12 +75,23 @@ func IsLoggerEnabled(name string) bool {
|
|||||||
return GetManager().GetLogger(name).IsEnabled()
|
return GetManager().GetLogger(name).IsEnabled()
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetConsoleLogger(loggerName, writerName string, level Level) {
|
func SetupStderrLogger(loggerName, writerName string, level Level) {
|
||||||
writer := NewEventWriterConsole(writerName, WriterMode{
|
writer := NewEventWriterConsole(writerName, WriterMode{
|
||||||
Level: level,
|
Level: level,
|
||||||
Flags: FlagsFromBits(LstdFlags),
|
Flags: FlagsFromBits(LstdFlags),
|
||||||
Colorize: CanColorStdout,
|
Colorize: CanColorStderr,
|
||||||
WriterOption: WriterConsoleOption{},
|
|
||||||
|
// For most CLI commands, it's better to use Stderr as log output:
|
||||||
|
// this logger is installed early (app.Before), before subcommands like "dump" redirect logging to stderr.
|
||||||
|
// If Stdout, early log output (e.g.: warning during config loading) goes to stdout
|
||||||
|
// and corrupts any command that writes data to stdout (e.g. "gitea dump --file -").
|
||||||
|
//
|
||||||
|
// It is inconsistent with the web server's default console logger from config
|
||||||
|
// (which will be initialized later and use Stdout by default), but there is no other way at the moment:
|
||||||
|
// many existing users depend on such behavior to collect web logs (e.g. fail2ban).
|
||||||
|
//
|
||||||
|
// Maybe need to refactor the logger system again in the future.
|
||||||
|
WriterOption: WriterConsoleOption{Stderr: true},
|
||||||
})
|
})
|
||||||
GetManager().GetLogger(loggerName).ReplaceAllWriters(writer)
|
GetManager().GetLogger(loggerName).ReplaceAllWriters(writer)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ func initLoggerByName(manager *log.LoggerManager, rootCfg ConfigProvider, logger
|
|||||||
}
|
}
|
||||||
|
|
||||||
func InitSQLLoggersForCli(level log.Level) {
|
func InitSQLLoggersForCli(level log.Level) {
|
||||||
log.SetConsoleLogger("xorm", "console", level)
|
log.SetupStderrLogger("xorm", "console-stderr", level)
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsAccessLogEnabled() bool {
|
func IsAccessLogEnabled() bool {
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ func init() {
|
|||||||
AppVer = "dev"
|
AppVer = "dev"
|
||||||
}
|
}
|
||||||
|
|
||||||
// We can rely on log.CanColorStdout being set properly because modules/log/console_windows.go comes before modules/setting/setting.go lexicographically
|
// FIXME: the logger shouldn't be initialized here, the app entry should initialize the logger
|
||||||
// By default set this logger at Info - we'll change it later, but we need to start with something.
|
// By default set this logger at Info - we'll change it later, but we need to start with something.
|
||||||
log.SetConsoleLogger(log.DEFAULT, "console", log.INFO)
|
log.SetupStderrLogger(log.DEFAULT, "console-stderr", log.INFO)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRunUserMatchCurrentUser returns false if configured run user does not match
|
// IsRunUserMatchCurrentUser returns false if configured run user does not match
|
||||||
|
|||||||
Reference in New Issue
Block a user