fix: prevent logger close recursion and unsafe writer closing

This commit is contained in:
2026-03-17 14:43:28 +03:00
parent 956755fe82
commit 6112a707c7
4 changed files with 227 additions and 24 deletions

28
io.go
View File

@@ -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)
}