-
Notifications
You must be signed in to change notification settings - Fork 1
/
zero_logger.go
74 lines (65 loc) · 1.82 KB
/
zero_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
package main
import (
"net"
"net/http"
"time"
"github.com/bsm/httpx"
"github.com/go-chi/chi/v5/middleware"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
type zerologEntry struct{ Method, URL, Proto, RemoteAddr, UA, Referer, RequestID string }
// From https://docs.datadoghq.com/logs/log_configuration/attributes_naming_convention/#http-requests
func (e *zerologEntry) Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) {
level := zerolog.InfoLevel
if status >= 500 {
level = zerolog.WarnLevel
}
ent := log.WithLevel(level).
Str("http.method", e.Method).
Str("http.url", e.URL).
Str("http.version", e.Proto).
Str("http.useragent", e.UA).
Int("http.status_code", status).
Int("network.bytes_written", bytes).
Dur("duration", elapsed)
if e.RequestID != "" {
ent = ent.Str("http.request_id", e.RequestID)
}
if e.Referer != "" {
ent = ent.Str("http.referer", e.Referer)
}
if e.RemoteAddr != "" {
host, port, _ := net.SplitHostPort(e.RemoteAddr)
ent = ent.
Str("network.client.ip", host).
Str("network.client.port", port)
}
ent.Send()
}
func (e *zerologEntry) Panic(v interface{}, stack []byte) {
log.Error().Interface("recovered", v).Bytes("stack", stack).Msg("panic")
}
func zerologFormatter(r *http.Request) middleware.LogEntry {
scheme := "http"
if r.TLS != nil {
scheme = "https"
}
return &zerologEntry{
Method: r.Method,
URL: scheme + "://" + r.Host + r.RequestURI,
Proto: r.Proto,
RemoteAddr: r.RemoteAddr,
UA: r.UserAgent(),
Referer: r.Header.Get("Referer"),
RequestID: r.Header.Get(middleware.RequestIDHeader),
}
}
func main() {
mux := httpx.NewMux(&httpx.MuxOptions{
Logger: httpx.Logger(zerologFormatter),
})
if err := http.ListenAndServe(":8080", mux); err != nil {
log.Panic().Msg(err.Error())
}
}