66
|
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 }
|