| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | package logrusimport (	"bufio"	"io"	"runtime")// Writer at INFO level. See WriterLevel for details.func (logger *Logger) Writer() *io.PipeWriter {	return logger.WriterLevel(InfoLevel)}// WriterLevel returns an io.Writer that can be used to write arbitrary text to// the logger at the given log level. Each line written to the writer will be// printed in the usual way using formatters and hooks. The writer is part of an// io.Pipe and it is the callers responsibility to close the writer when done.// This can be used to override the standard library logger easily.func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {	return NewEntry(logger).WriterLevel(level)}func (entry *Entry) Writer() *io.PipeWriter {	return entry.WriterLevel(InfoLevel)}func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {	reader, writer := io.Pipe()	var printFunc func(args ...interface{})	switch level {	case TraceLevel:		printFunc = entry.Trace	case DebugLevel:		printFunc = entry.Debug	case InfoLevel:		printFunc = entry.Info	case WarnLevel:		printFunc = entry.Warn	case ErrorLevel:		printFunc = entry.Error	case FatalLevel:		printFunc = entry.Fatal	case PanicLevel:		printFunc = entry.Panic	default:		printFunc = entry.Print	}	go entry.writerScanner(reader, printFunc)	runtime.SetFinalizer(writer, writerFinalizer)	return writer}func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {	scanner := bufio.NewScanner(reader)	for scanner.Scan() {		printFunc(scanner.Text())	}	if err := scanner.Err(); err != nil {		entry.Errorf("Error while reading from Writer: %s", err)	}	reader.Close()}func writerFinalizer(writer *io.PipeWriter) {	writer.Close()}
 |