-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogger.go
110 lines (96 loc) · 2.51 KB
/
logger.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package main
import (
"io"
"net/http"
"os"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func newZapLogger(file *os.File) *zap.Logger {
consoleEncoderConfig := zap.NewDevelopmentEncoderConfig()
consoleEncoderConfig.EncodeTime = zapcore.RFC3339TimeEncoder
consoleEncoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
cores := []zapcore.Core{
zapcore.NewCore(
zapcore.NewConsoleEncoder(consoleEncoderConfig),
zapcore.Lock(os.Stdout),
zapcore.DebugLevel,
),
}
if file != nil {
fileEncoderConfig := zap.NewProductionEncoderConfig()
fileEncoderConfig.EncodeTime = zapcore.RFC3339TimeEncoder
fileEncoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
// add file encoder to cores
cores = append(
cores,
zapcore.NewCore(
zapcore.NewJSONEncoder(fileEncoderConfig),
zapcore.Lock(file),
zapcore.InfoLevel,
),
)
}
return zap.New(
zapcore.NewTee(cores...),
zap.AddCaller(),
zap.AddStacktrace(zapcore.ErrorLevel),
)
}
// esCustomLogger implements the elastictransport.Logger interface.
type esCustomLogger struct {
*zap.Logger
}
// LogRoundTrip prints the information about request and response.
func (l *esCustomLogger) LogRoundTrip(
req *http.Request,
res *http.Response,
err error,
start time.Time,
dur time.Duration,
) error {
var (
lvl zapcore.Level
nReq int64
nRes int64
)
// Set log level.
//
switch {
case err != nil:
lvl = zapcore.ErrorLevel
case res != nil && res.StatusCode > 0 && res.StatusCode < 300:
lvl = zapcore.InfoLevel
case res != nil && res.StatusCode > 299 && res.StatusCode < 500:
lvl = zapcore.WarnLevel
case res != nil && res.StatusCode > 499:
lvl = zapcore.ErrorLevel
default:
lvl = zapcore.ErrorLevel
}
// Count number of bytes in request and response.
//
if req != nil && req.Body != nil && req.Body != http.NoBody {
nReq, _ = io.Copy(io.Discard, req.Body)
}
if res != nil && res.Body != nil && res.Body != http.NoBody {
nRes, _ = io.Copy(io.Discard, res.Body)
}
// Log event.
//
if ce := l.Check(lvl, req.URL.String()); ce != nil {
ce.Write(
zap.String("method", req.Method),
zap.Int("status_code", res.StatusCode),
zap.Duration("duration", dur),
zap.Int64("req_bytes", nReq),
zap.Int64("res_bytes", nRes),
)
}
return nil
}
// RequestBodyEnabled makes the client pass request body to logger
func (l *esCustomLogger) RequestBodyEnabled() bool { return true }
// RequestBodyEnabled makes the client pass response body to logger
func (l *esCustomLogger) ResponseBodyEnabled() bool { return true }