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

View File

@@ -1,7 +1,6 @@
package slog
import (
"bufio"
"encoding/json"
"fmt"
"io"
@@ -20,17 +19,13 @@ type LoggerWriter interface {
type LoggerTextWriter struct {
LoggerWriter
writer io.Writer
closer io.Closer
printTraceback bool
printTime bool
}
func (w *LoggerTextWriter) Write(p []byte) (n int, err error) {
n, err = w.writer.Write(p)
if err != nil {
return n, err
}
err = bufio.NewWriter(w.writer).Flush()
return n, err
return w.writer.Write(p)
}
func (w *LoggerTextWriter) Print(level LogLevel, prefix string, _ []*MethodTraceback, messages ...any) error {
s := BuildString(level, prefix, w.printTime, w.printTraceback, messages...)
@@ -38,13 +33,17 @@ func (w *LoggerTextWriter) Print(level LogLevel, prefix string, _ []*MethodTrace
return err
}
func (w *LoggerTextWriter) Close() error {
return w.writer.(io.Closer).Close()
if w.closer == nil {
return nil
}
return w.closer.Close()
}
// LoggerJsonWriter write into writer JSON
type LoggerJsonWriter struct {
LoggerWriter
writer io.Writer
closer io.Closer
pretty bool
}
type LoggerJsonMessage struct {
@@ -56,12 +55,7 @@ type LoggerJsonMessage struct {
}
func (w *LoggerJsonWriter) Write(data []byte) (int, error) {
n, err := w.writer.Write(data)
if err != nil {
return n, err
}
err = bufio.NewWriter(w.writer).Flush()
return n, err
return w.writer.Write(data)
}
func (w *LoggerJsonWriter) Print(level LogLevel, prefix string, traceback []*MethodTraceback, messages ...any) error {
msg := Map(messages, func(el any) string {
@@ -98,7 +92,10 @@ func (w *LoggerJsonWriter) Print(level LogLevel, prefix string, traceback []*Met
return err
}
func (w *LoggerJsonWriter) Close() error {
return w.writer.(io.Closer).Close()
if w.closer == nil {
return nil
}
return w.closer.Close()
}
func CreateTextWriter(w io.Writer, printTraceback, printTime bool) *LoggerTextWriter {
@@ -116,10 +113,14 @@ func CreateTextFileWriter(path string, printTraceback, printTime bool) (*LoggerT
if err != nil {
return nil, err
}
return CreateTextWriter(file, printTraceback, printTime), nil
writer := CreateTextWriter(file, printTraceback, printTime)
writer.closer = file
return writer, nil
}
func CreateTextStdoutWriter(printTraceback, printTime bool) *LoggerTextWriter {
return CreateTextWriter(os.Stdout, printTraceback, printTime)
writer := CreateTextWriter(os.Stdout, printTraceback, printTime)
writer.closer = nil
return writer
}
func CreateJsonWriter(w io.Writer, pretty bool) *LoggerJsonWriter {
@@ -129,7 +130,9 @@ func CreateJsonWriter(w io.Writer, pretty bool) *LoggerJsonWriter {
return writer
}
func CreateJsonStdoutWriter(pretty bool) *LoggerJsonWriter {
return CreateJsonWriter(os.Stdout, pretty)
writer := CreateJsonWriter(os.Stdout, pretty)
writer.closer = nil
return writer
}
func CreateJsonFileWriter(path string, pretty bool) (*LoggerJsonWriter, error) {
err := os.MkdirAll(filepath.Dir(path), os.ModePerm)
@@ -140,5 +143,7 @@ func CreateJsonFileWriter(path string, pretty bool) (*LoggerJsonWriter, error) {
if err != nil {
return nil, err
}
return CreateJsonWriter(file, pretty), nil
writer := CreateJsonWriter(file, pretty)
writer.closer = file
return writer, nil
}