[67] | 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 | }
|
---|