From a22da39e1cd3fd54bd0ea30a06cc8575b786ab18 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Sun, 26 Apr 2020 17:11:53 +0300 Subject: [PATCH] logger: add caller info to default implementation (#1575) Signed-off-by: Vasiliy Tolstov --- logger/default.go | 18 ++++++++++++++---- logger/logger_test.go | 1 + logger/options.go | 9 +++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/logger/default.go b/logger/default.go index 0b3a432a..6b3f4652 100644 --- a/logger/default.go +++ b/logger/default.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "os" + "runtime" "sort" "sync" "time" @@ -64,6 +65,10 @@ func (l *defaultLogger) Log(level Level, v ...interface{}) { fields["level"] = level.String() + if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok { + fields["caller"] = fmt.Sprintf("%s:%d", file, line) + } + rec := dlog.Record{ Timestamp: time.Now(), Message: fmt.Sprint(v...), @@ -101,6 +106,10 @@ func (l *defaultLogger) Logf(level Level, format string, v ...interface{}) { fields["level"] = level.String() + if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok { + fields["caller"] = fmt.Sprintf("%s:%d", file, line) + } + rec := dlog.Record{ Timestamp: time.Now(), Message: fmt.Sprintf(format, v...), @@ -134,10 +143,11 @@ func (n *defaultLogger) Options() Options { func NewLogger(opts ...Option) Logger { // Default options options := Options{ - Level: InfoLevel, - Fields: make(map[string]interface{}), - Out: os.Stderr, - Context: context.Background(), + Level: InfoLevel, + Fields: make(map[string]interface{}), + Out: os.Stderr, + CallerSkipCount: 1, + Context: context.Background(), } l := &defaultLogger{opts: options} diff --git a/logger/logger_test.go b/logger/logger_test.go index 846038eb..f36a3a3b 100644 --- a/logger/logger_test.go +++ b/logger/logger_test.go @@ -14,4 +14,5 @@ func TestLogger(t *testing.T) { h2.Trace("trace_msg2") h2.Warn("warn_msg2") + l.Fields(map[string]interface{}{"key3": "val4"}).Log(InfoLevel, "test_msg") } diff --git a/logger/options.go b/logger/options.go index ef13d49f..d0a03302 100644 --- a/logger/options.go +++ b/logger/options.go @@ -14,6 +14,8 @@ type Options struct { Fields map[string]interface{} // It's common to set this to a file, or leave it default which is `os.Stderr` Out io.Writer + // Caller skip frame count for file:line info + CallerSkipCount int // Alternative options Context context.Context } @@ -39,6 +41,13 @@ func WithOutput(out io.Writer) Option { } } +// WithCallerSkipCount set frame count to skip +func WithCallerSkipCount(c int) Option { + return func(args *Options) { + args.CallerSkipCount = c + } +} + func SetOption(k, v interface{}) Option { return func(o *Options) { if o.Context == nil {