1d1fd2d9ce
This commit adds a variant of the logger's Writer() function that accepts a log level. When the variant is used, any messages written to the returned pipe will be written with the provided level. The original Writer() function uses the logger's Print() method as it always has.
54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
package logrus
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"runtime"
|
|
)
|
|
|
|
func (logger *Logger) Writer() *io.PipeWriter {
|
|
return logger.WriterLevel(255)
|
|
}
|
|
|
|
func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {
|
|
reader, writer := io.Pipe()
|
|
|
|
var printFunc func(args ...interface{})
|
|
switch level {
|
|
case DebugLevel:
|
|
printFunc = logger.Debug
|
|
case InfoLevel:
|
|
printFunc = logger.Info
|
|
case WarnLevel:
|
|
printFunc = logger.Warn
|
|
case ErrorLevel:
|
|
printFunc = logger.Error
|
|
case FatalLevel:
|
|
printFunc = logger.Fatal
|
|
case PanicLevel:
|
|
printFunc = logger.Panic
|
|
default:
|
|
printFunc = logger.Print
|
|
}
|
|
|
|
go logger.writerScanner(reader, printFunc)
|
|
runtime.SetFinalizer(writer, writerFinalizer)
|
|
|
|
return writer
|
|
}
|
|
|
|
func (logger *Logger) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {
|
|
scanner := bufio.NewScanner(reader)
|
|
for scanner.Scan() {
|
|
printFunc(scanner.Text())
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
logger.Errorf("Error while reading from Writer: %s", err)
|
|
}
|
|
reader.Close()
|
|
}
|
|
|
|
func writerFinalizer(writer *io.PipeWriter) {
|
|
writer.Close()
|
|
}
|