Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.7 KiB
70 lines
1.7 KiB
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() |
|
}
|
|
|