From 778dd449e291f3204dc7b9e3e42273f0e4883920 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Fri, 6 Aug 2021 13:45:11 +0300 Subject: [PATCH] logger: add NewStdLogger and RedirectStdLogger Signed-off-by: Vasiliy Tolstov --- logger/logger_test.go | 28 ++++++++++++++++++++++++++++ logger/stdlogger.go | 16 ++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/logger/logger_test.go b/logger/logger_test.go index 64c55d74..576c1a02 100644 --- a/logger/logger_test.go +++ b/logger/logger_test.go @@ -3,9 +3,37 @@ package logger import ( "bytes" "context" + "log" "testing" ) +func TestRedirectStdLogger(t *testing.T) { + buf := bytes.NewBuffer(nil) + l := NewLogger(WithLevel(TraceLevel), WithOutput(buf)) + if err := l.Init(); err != nil { + t.Fatal(err) + } + fn := RedirectStdLogger(l, ErrorLevel) + defer fn() + log.Print("test") + if !bytes.Contains(buf.Bytes(), []byte(`"level":"error","msg":"test","timestamp"`)) { + t.Fatalf("logger error, buf %s", buf.Bytes()) + } +} + +func TestStdLogger(t *testing.T) { + buf := bytes.NewBuffer(nil) + l := NewLogger(WithLevel(TraceLevel), WithOutput(buf)) + if err := l.Init(); err != nil { + t.Fatal(err) + } + lg := NewStdLogger(l, ErrorLevel) + lg.Print("test") + if !bytes.Contains(buf.Bytes(), []byte(`"level":"error","msg":"test","timestamp"`)) { + t.Fatalf("logger error, buf %s", buf.Bytes()) + } +} + func TestLogger(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) diff --git a/logger/stdlogger.go b/logger/stdlogger.go index 08890e15..c79b1631 100644 --- a/logger/stdlogger.go +++ b/logger/stdlogger.go @@ -1,6 +1,7 @@ package logger import ( + "bytes" "log" ) @@ -14,6 +15,21 @@ func NewStdLogger(l Logger, level Level) *log.Logger { } func (sl *stdLogger) Write(p []byte) (int, error) { + p = bytes.TrimSpace(p) sl.l.Log(sl.l.Options().Context, sl.level, string(p)) return len(p), nil } + +func RedirectStdLogger(l Logger, level Level) func() { + flags := log.Flags() + prefix := log.Prefix() + writer := log.Writer() + log.SetFlags(0) + log.SetPrefix("") + log.SetOutput(&stdLogger{l: l, level: level}) + return func() { + log.SetFlags(flags) + log.SetPrefix(prefix) + log.SetOutput(writer) + } +}