/
logrus.go
71 lines (63 loc) · 1.65 KB
/
logrus.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package log
import (
"context"
"io"
"github.com/sirupsen/logrus"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// dest is a logging destination.
type dest struct {
ctx context.Context
}
var _ logrus.Hook = dest{}
// Fire implements logrus.Hook.
func (d dest) Fire(e *logrus.Entry) error {
var fields []zap.Field
for key, value := range e.Data {
if key == logrus.ErrorKey {
if err, ok := value.(error); ok {
fields = append(fields, zap.Error(err))
} else {
fields = append(fields, zap.Any(key, value))
}
continue
}
fields = append(fields, zap.Any(key, value))
}
ctx := d.ctx
if e.Context != nil {
ctx = e.Context
}
if c := e.Caller; c != nil {
fields = append(fields, zap.String("caller", zapcore.EntryCaller{
PC: c.PC,
File: c.File,
Defined: true,
Line: c.Line,
Function: c.Function,
}.TrimmedPath()))
ctx = withLogger(ctx, extractLogger(ctx).WithOptions(zap.WithCaller(false)))
}
switch e.Level { //exhaustive:enforce
case logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel:
Error(ctx, e.Message, fields...)
case logrus.WarnLevel, logrus.InfoLevel:
Info(ctx, e.Message, fields...)
case logrus.DebugLevel, logrus.TraceLevel:
Debug(ctx, e.Message, fields...)
}
return nil
}
// Levels implements logrus.Hook.
func (d dest) Levels() []logrus.Level { return logrus.AllLevels }
// NewLogrus returns a *logrus.Logger that logs to the provided context (or a context passed with
// each logged entry, if available).
func NewLogrus(ctx context.Context) *logrus.Logger {
l := logrus.New()
l.Out = io.Discard
l.Level = logrus.TraceLevel
l.ReportCaller = true
l.AddHook(dest{ctx: ctx})
return l
}