44 "bufio"
55 "io"
66 "runtime"
7- "strings"
87)
98
109// Writer at INFO level. See WriterLevel for details.
@@ -21,18 +20,15 @@ func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {
2120 return NewEntry (logger ).WriterLevel (level )
2221}
2322
24- // Writer returns an io.Writer that writes to the logger at the info log level
2523func (entry * Entry ) Writer () * io.PipeWriter {
2624 return entry .WriterLevel (InfoLevel )
2725}
2826
29- // WriterLevel returns an io.Writer that writes to the logger at the given log level
3027func (entry * Entry ) WriterLevel (level Level ) * io.PipeWriter {
3128 reader , writer := io .Pipe ()
3229
3330 var printFunc func (args ... interface {})
3431
35- // Determine which log function to use based on the specified log level
3632 switch level {
3733 case TraceLevel :
3834 printFunc = entry .Trace
@@ -52,51 +48,23 @@ func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
5248 printFunc = entry .Print
5349 }
5450
55- // Start a new goroutine to scan the input and write it to the logger using the specified print function.
56- // It splits the input into chunks of up to 64KB to avoid buffer overflows.
5751 go entry .writerScanner (reader , printFunc )
58-
59- // Set a finalizer function to close the writer when it is garbage collected
6052 runtime .SetFinalizer (writer , writerFinalizer )
6153
6254 return writer
6355}
6456
65- // writerScanner scans the input from the reader and writes it to the logger
6657func (entry * Entry ) writerScanner (reader * io.PipeReader , printFunc func (args ... interface {})) {
6758 scanner := bufio .NewScanner (reader )
68-
69- // Set the buffer size to the maximum token size to avoid buffer overflows
70- scanner .Buffer (make ([]byte , bufio .MaxScanTokenSize ), bufio .MaxScanTokenSize )
71-
72- // Define a split function to split the input into chunks of up to 64KB
73- chunkSize := 64 * 1024 // 64KB
74- splitFunc := func (data []byte , atEOF bool ) (int , []byte , error ) {
75- if len (data ) > chunkSize {
76- return chunkSize , data [:chunkSize ], nil
77- }
78-
79- return len (data ), data , nil
80- }
81-
82- //Use the custom split function to split the input
83- scanner .Split (splitFunc )
84-
85- // Scan the input and write it to the logger using the specified print function
8659 for scanner .Scan () {
87- printFunc (strings . TrimRight ( scanner .Text (), " \r \n " ))
60+ printFunc (scanner .Text ())
8861 }
89-
90- // If there was an error while scanning the input, log an error
9162 if err := scanner .Err (); err != nil {
9263 entry .Errorf ("Error while reading from Writer: %s" , err )
9364 }
94-
95- // Close the reader when we are done
9665 reader .Close ()
9766}
9867
99- // WriterFinalizer is a finalizer function that closes then given writer when it is garbage collected
10068func writerFinalizer (writer * io.PipeWriter ) {
10169 writer .Close ()
10270}
0 commit comments