fix: prevent logger close recursion and unsafe writer closing
This commit is contained in:
43
writers.go
43
writers.go
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user