fix: prevent logger close recursion and unsafe writer closing
This commit is contained in:
28
io.go
28
io.go
@@ -64,12 +64,18 @@ func (l *Logger) print(level LogLevel, m ...any) {
|
||||
if l.level.n < level.n {
|
||||
return
|
||||
}
|
||||
if len(l.writers) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
tb := getFullTraceback(0)
|
||||
for _, writer := range l.writers {
|
||||
if writer == nil {
|
||||
continue
|
||||
}
|
||||
err := writer.Print(level, l.prefix, tb, m...)
|
||||
if err != nil {
|
||||
l.Error(err)
|
||||
l.reportWriterError(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,12 +86,28 @@ func (l *Logger) println(level LogLevel, m ...any) {
|
||||
if l.level.n < level.n {
|
||||
return
|
||||
}
|
||||
if len(l.writers) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
tb := getFullTraceback(0)
|
||||
messages := append(append(make([]any, 0, len(m)+1), m...), "\n")
|
||||
for _, writer := range l.writers {
|
||||
err := writer.Print(level, l.prefix, tb, append(m, "\n")...)
|
||||
if writer == nil {
|
||||
continue
|
||||
}
|
||||
err := writer.Print(level, l.prefix, tb, messages...)
|
||||
if err != nil {
|
||||
l.Error(err)
|
||||
l.reportWriterError(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// reportWriterError writes internal writer failures directly to stderr to avoid
|
||||
// re-entering the same logger path that just failed.
|
||||
func (l *Logger) reportWriterError(err error) {
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
_, _ = fmt.Fprintf(os.Stderr, "[%s] logger writer error: %v\n", l.prefix, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user