writer.go (1753B)
1 package logrus 2 3 import ( 4 "bufio" 5 "io" 6 "runtime" 7 ) 8 9 // Writer at INFO level. See WriterLevel for details. 10 func (logger *Logger) Writer() *io.PipeWriter { 11 return logger.WriterLevel(InfoLevel) 12 } 13 14 // WriterLevel returns an io.Writer that can be used to write arbitrary text to 15 // the logger at the given log level. Each line written to the writer will be 16 // printed in the usual way using formatters and hooks. The writer is part of an 17 // io.Pipe and it is the callers responsibility to close the writer when done. 18 // This can be used to override the standard library logger easily. 19 func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { 20 return NewEntry(logger).WriterLevel(level) 21 } 22 23 func (entry *Entry) Writer() *io.PipeWriter { 24 return entry.WriterLevel(InfoLevel) 25 } 26 27 func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { 28 reader, writer := io.Pipe() 29 30 var printFunc func(args ...interface{}) 31 32 switch level { 33 case TraceLevel: 34 printFunc = entry.Trace 35 case DebugLevel: 36 printFunc = entry.Debug 37 case InfoLevel: 38 printFunc = entry.Info 39 case WarnLevel: 40 printFunc = entry.Warn 41 case ErrorLevel: 42 printFunc = entry.Error 43 case FatalLevel: 44 printFunc = entry.Fatal 45 case PanicLevel: 46 printFunc = entry.Panic 47 default: 48 printFunc = entry.Print 49 } 50 51 go entry.writerScanner(reader, printFunc) 52 runtime.SetFinalizer(writer, writerFinalizer) 53 54 return writer 55 } 56 57 func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { 58 scanner := bufio.NewScanner(reader) 59 for scanner.Scan() { 60 printFunc(scanner.Text()) 61 } 62 if err := scanner.Err(); err != nil { 63 entry.Errorf("Error while reading from Writer: %s", err) 64 } 65 reader.Close() 66 } 67 68 func writerFinalizer(writer *io.PipeWriter) { 69 writer.Close() 70 }