Skip to content

Commit 81ab71e

Browse files
zeripathdelvhtechknowlogick
authored and
Sysoev, Vladimir
committed
Disable doctor logging on panic (go-gitea#20847)
* Disable doctor logging on panic If permissions are incorrect for writing to the doctor log simply disable the log file instead of panicing. Related go-gitea#20570 Signed-off-by: Andrew Thornton <[email protected]> * Update cmd/doctor.go * Update cmd/doctor.go Co-authored-by: delvh <[email protected]> Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: delvh <[email protected]> Co-authored-by: techknowlogick <[email protected]>
1 parent 1c3b60e commit 81ab71e

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

cmd/doctor.go

+42-11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package cmd
66

77
import (
8+
"errors"
89
"fmt"
910
golog "log"
1011
"os"
@@ -123,32 +124,62 @@ func runRecreateTable(ctx *cli.Context) error {
123124
})
124125
}
125126

126-
func runDoctor(ctx *cli.Context) error {
127-
stdCtx, cancel := installSignals()
128-
defer cancel()
129-
130-
// Silence the default loggers
131-
log.DelNamedLogger("console")
132-
log.DelNamedLogger(log.DEFAULT)
133-
134-
// Now setup our own
127+
func setDoctorLogger(ctx *cli.Context) {
135128
logFile := ctx.String("log-file")
136129
if !ctx.IsSet("log-file") {
137130
logFile = "doctor.log"
138131
}
139-
140132
colorize := log.CanColorStdout
141133
if ctx.IsSet("color") {
142134
colorize = ctx.Bool("color")
143135
}
144136

145137
if len(logFile) == 0 {
146138
log.NewLogger(1000, "doctor", "console", fmt.Sprintf(`{"level":"NONE","stacktracelevel":"NONE","colorize":%t}`, colorize))
147-
} else if logFile == "-" {
139+
return
140+
}
141+
142+
defer func() {
143+
recovered := recover()
144+
if recovered == nil {
145+
return
146+
}
147+
148+
err, ok := recovered.(error)
149+
if !ok {
150+
panic(recovered)
151+
}
152+
if errors.Is(err, os.ErrPermission) {
153+
fmt.Fprintf(os.Stderr, "ERROR: Unable to write logs to provided file due to permissions error: %s\n %v\n", logFile, err)
154+
} else {
155+
fmt.Fprintf(os.Stderr, "ERROR: Unable to write logs to provided file: %s\n %v\n", logFile, err)
156+
}
157+
fmt.Fprintf(os.Stderr, "WARN: Logging will be disabled\n Use `--log-file` to configure log file location\n")
158+
log.NewLogger(1000, "doctor", "console", fmt.Sprintf(`{"level":"NONE","stacktracelevel":"NONE","colorize":%t}`, colorize))
159+
}()
160+
161+
if logFile == "-" {
148162
log.NewLogger(1000, "doctor", "console", fmt.Sprintf(`{"level":"trace","stacktracelevel":"NONE","colorize":%t}`, colorize))
149163
} else {
150164
log.NewLogger(1000, "doctor", "file", fmt.Sprintf(`{"filename":%q,"level":"trace","stacktracelevel":"NONE"}`, logFile))
151165
}
166+
}
167+
168+
func runDoctor(ctx *cli.Context) error {
169+
stdCtx, cancel := installSignals()
170+
defer cancel()
171+
172+
// Silence the default loggers
173+
log.DelNamedLogger("console")
174+
log.DelNamedLogger(log.DEFAULT)
175+
176+
// Now setup our own
177+
setDoctorLogger(ctx)
178+
179+
colorize := log.CanColorStdout
180+
if ctx.IsSet("color") {
181+
colorize = ctx.Bool("color")
182+
}
152183

153184
// Finally redirect the default golog to here
154185
golog.SetFlags(0)

modules/log/multichannel.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@ func newLogger(name string, buffer int64) *MultiChannelledLogger {
3333
func (l *MultiChannelledLogger) SetLogger(name, provider, config string) error {
3434
eventLogger, err := NewChannelledLog(l.ctx, name, provider, config, l.bufferLength)
3535
if err != nil {
36-
return fmt.Errorf("Failed to create sublogger (%s): %v", name, err)
36+
return fmt.Errorf("failed to create sublogger (%s): %w", name, err)
3737
}
3838

3939
l.MultiChannelledLog.DelLogger(name)
4040

4141
err = l.MultiChannelledLog.AddLogger(eventLogger)
4242
if err != nil {
4343
if IsErrDuplicateName(err) {
44-
return fmt.Errorf("Duplicate named sublogger %s %v", name, l.MultiChannelledLog.GetEventLoggerNames())
44+
return fmt.Errorf("%w other names: %v", err, l.MultiChannelledLog.GetEventLoggerNames())
4545
}
46-
return fmt.Errorf("Failed to add sublogger (%s): %v", name, err)
46+
return fmt.Errorf("failed to add sublogger (%s): %w", name, err)
4747
}
4848

4949
return nil

0 commit comments

Comments
 (0)