1package logrus 2 3import ( 4 "bufio" 5 "io" 6 "runtime" 7) 8 9func (logger *Logger) Writer() *io.PipeWriter { 10 return logger.WriterLevel(InfoLevel) 11} 12 13func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { 14 return NewEntry(logger).WriterLevel(level) 15} 16 17func (entry *Entry) Writer() *io.PipeWriter { 18 return entry.WriterLevel(InfoLevel) 19} 20 21func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { 22 reader, writer := io.Pipe() 23 24 var printFunc func(args ...interface{}) 25 26 switch level { 27 case TraceLevel: 28 printFunc = entry.Trace 29 case DebugLevel: 30 printFunc = entry.Debug 31 case InfoLevel: 32 printFunc = entry.Info 33 case WarnLevel: 34 printFunc = entry.Warn 35 case ErrorLevel: 36 printFunc = entry.Error 37 case FatalLevel: 38 printFunc = entry.Fatal 39 case PanicLevel: 40 printFunc = entry.Panic 41 default: 42 printFunc = entry.Print 43 } 44 45 go entry.writerScanner(reader, printFunc) 46 runtime.SetFinalizer(writer, writerFinalizer) 47 48 return writer 49} 50 51func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { 52 scanner := bufio.NewScanner(reader) 53 for scanner.Scan() { 54 printFunc(scanner.Text()) 55 } 56 if err := scanner.Err(); err != nil { 57 entry.Errorf("Error while reading from Writer: %s", err) 58 } 59 reader.Close() 60} 61 62func writerFinalizer(writer *io.PipeWriter) { 63 writer.Close() 64} 65