forked from go-chi/httplog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
104 lines (84 loc) · 2.92 KB
/
config.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
package httplog
import (
"fmt"
"os"
"strings"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
var DefaultOptions = Options{
LogLevel: "info",
LevelFieldName: "level",
JSON: true,
Concise: true,
Tags: nil,
SkipHeaders: nil,
TimeFieldFormat: time.RFC3339Nano,
TimeFieldName: "timestamp",
}
type Options struct {
// LogLevel defines the minimum level of severity that app should log.
//
// Must be one of: ["trace", "debug", "info", "warn", "error", "critical"]
LogLevel string
// LevelFieldName sets the field name for the log level or severity.
// Some providers parse and search for different field names.
LevelFieldName string
// JSON enables structured logging output in json. Make sure to enable this
// in production mode so log aggregators can receive data in parsable format.
//
// In local development mode, its appropriate to set this value to false to
// receive pretty output and stacktraces to stdout.
JSON bool
// Concise mode includes fewer log details during the request flow. For example
// excluding details like request content length, user-agent and other details.
// This is useful if during development your console is too noisy.
Concise bool
// Tags are additional fields included at the root level of all logs.
// These can be useful for example the commit hash of a build, or an environment
// name like prod/stg/dev
Tags map[string]string
// SkipHeaders are additional headers which are redacted from the logs
SkipHeaders []string
// TimeFieldFormat defines the time format of the Time field, defaulting to "time.RFC3339Nano" see options at:
// https://pkg.go.dev/time#pkg-constants
TimeFieldFormat string
// TimeFieldName sets the field name for the time field.
// Some providers parse and search for different field names.
TimeFieldName string
}
// Configure will set new global/default options for the httplog and behaviour
// of underlying zerolog pkg and its global logger.
func Configure(opts Options) {
if opts.LogLevel == "" {
opts.LogLevel = "info"
}
if opts.LevelFieldName == "" {
opts.LevelFieldName = "level"
}
if opts.TimeFieldFormat == "" {
opts.TimeFieldFormat = time.RFC3339Nano
}
if opts.TimeFieldName == "" {
opts.TimeFieldName = "timestamp"
}
// Pre-downcase all SkipHeaders
for i, header := range opts.SkipHeaders {
opts.SkipHeaders[i] = strings.ToLower(header)
}
DefaultOptions = opts
// Config the zerolog global logger
logLevel, err := zerolog.ParseLevel(strings.ToLower(opts.LogLevel))
if err != nil {
fmt.Printf("httplog: error! %v\n", err)
os.Exit(1)
}
zerolog.SetGlobalLevel(logLevel)
zerolog.LevelFieldName = strings.ToLower(opts.LevelFieldName)
zerolog.TimestampFieldName = strings.ToLower(opts.TimeFieldName)
zerolog.TimeFieldFormat = opts.TimeFieldFormat
if !opts.JSON {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: opts.TimeFieldFormat})
}
}