-
Notifications
You must be signed in to change notification settings - Fork 1
/
options.go
131 lines (112 loc) · 2.7 KB
/
options.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package logging
import (
"encoding/json"
"os"
"github.com/pkg/errors"
)
type options struct {
Format string `json:"format"`
Level Level `json:"level"`
TraceHeader string `json:"traceHeader"`
LogRequests bool `json:"logRequests"`
LogResponses bool `json:"logResponses"`
TimeFormat string `json:"timeFormat"`
CallerSkip int `json:"callerSkip"`
}
func defaultOptions() *options {
return &options{
Format: formatFromEnv(),
Level: levelFromEnv(),
TraceHeader: DefaultTraceHeader,
CallerSkip: 1,
}
}
func formatFromEnv() (format string) {
if format = os.Getenv("LOG_FORMAT"); format == "" {
format = "json"
}
return
}
func levelFromEnv() (level Level) {
v := os.Getenv("LOG_LEVEL")
if err := level.UnmarshalText([]byte(v)); err != nil {
level = InfoLevel
}
return
}
func (o *options) apply(opts []Option) (err error) {
for _, fn := range opts {
if err = fn(o); err != nil {
return
}
}
return
}
// Option is the type used to modify logger options.
type Option func(o *options) error
// WithConfig uses a JSON to configure the logger.
func WithConfig(raw json.RawMessage) Option {
return func(o *options) error {
if err := json.Unmarshal(raw, o); err != nil {
return errors.Wrap(err, "error unmarshalling logging attributes")
}
return nil
}
}
// WithFormatText configures the format of the logs as text. Defaults to text.
func WithFormatText() Option {
return func(o *options) error {
o.Format = "text"
return nil
}
}
// WithFormatJSON configures the format of the logs as JSON. Defaults to text.
func WithFormatJSON() Option {
return func(o *options) error {
o.Format = "json"
return nil
}
}
// WithTimeFormat sets a specific format for the time fields.
func WithTimeFormat(format string) Option {
return func(o *options) error {
o.TimeFormat = format
return nil
}
}
// WithTraceHeader defines the name of the header used for tracing. Defaults to
// 'Traceparent'.
func WithTraceHeader(name string) Option {
return func(o *options) error {
o.TraceHeader = name
return nil
}
}
// WithLogRequests enables the log of the requests.
func WithLogRequests() Option {
return func(o *options) error {
o.LogRequests = true
return nil
}
}
// WithLogResponses enables the log of responses
func WithLogResponses() Option {
return func(o *options) error {
o.LogResponses = true
return nil
}
}
// WithCallerSkip increases the number of callers skipped by caller annotation.
func WithCallerSkip(skip int) Option {
return func(o *options) error {
o.CallerSkip = skip
return nil
}
}
// WithLogLevel sets the verbosity of the logger.
func WithLogLevel(level Level) Option {
return func(o *options) error {
o.Level = level
return nil
}
}