12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package logrus
- import (
- "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()
- }
|