forked from nautilus/gateway
-
Notifications
You must be signed in to change notification settings - Fork 0
/
logging.go
127 lines (108 loc) · 3.11 KB
/
logging.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
package gateway
import (
"os"
"github.com/nautilus/graphql"
"github.com/sirupsen/logrus"
)
// Logger logs messages
type Logger interface {
Trace(args ...interface{})
Debug(args ...interface{})
Info(args ...interface{})
Warn(args ...interface{})
WithFields(fields LoggerFields) Logger
QueryPlanStep(step *QueryPlanStep)
}
// DefaultLogger handles the logging in the gateway library
type DefaultLogger struct {
fields logrus.Fields
}
// LoggerFields is a wrapper over a map of key,value pairs to associate with the log
type LoggerFields map[string]interface{}
func (l *DefaultLogger) Trace(args ...interface{}) {
if globalLogLevel >= logrus.TraceLevel {
entry := newLogEntry(logrus.TraceLevel)
// if there are fields
if l.fields != nil {
entry = entry.WithFields(l.fields)
}
entry.Trace(args...)
}
}
// Debug should be used for any logging that would be useful for debugging
func (l *DefaultLogger) Debug(args ...interface{}) {
if globalLogLevel >= logrus.DebugLevel {
entry := newLogEntry(logrus.TraceLevel)
// if there are fields
if l.fields != nil {
entry = entry.WithFields(l.fields)
}
entry.Debug(args...)
}
}
// Info should be used for any logging that doesn't necessarily need attention but is nice to see by default
func (l *DefaultLogger) Info(args ...interface{}) {
if globalLogLevel >= logrus.InfoLevel {
entry := newLogEntry(logrus.InfoLevel)
// if there are fields
if l.fields != nil {
entry = entry.WithFields(l.fields)
}
entry.Info(args...)
}
}
// Warn should be used for logging that needs attention
func (l *DefaultLogger) Warn(args ...interface{}) {
if globalLogLevel >= logrus.WarnLevel {
entry := newLogEntry(logrus.WarnLevel)
// if there are fields
if l.fields != nil {
entry = entry.WithFields(l.fields)
}
entry.Warn(args...)
}
}
// WithFields adds the provided fields to the Log
func (l *DefaultLogger) WithFields(fields LoggerFields) Logger {
// build up the logrus fields
logrusFields := logrus.Fields{}
for key, value := range fields {
logrusFields[key] = value
}
return &DefaultLogger{fields: logrusFields}
}
// QueryPlanStep formats and logs a query plan step for human consumption
func (l *DefaultLogger) QueryPlanStep(step *QueryPlanStep) {
if globalLogLevel >= logrus.DebugLevel {
l.WithFields(LoggerFields{
"id": step.ParentID,
"insertion point": step.InsertionPoint,
}).Debug("QueryPlanStep.ParentType: ", step.ParentType)
l.Debug("QueryPlanStep.SelectionSet: ", graphql.FormatSelectionSet(step.SelectionSet))
}
}
var globalLogLevel logrus.Level
var log Logger = &DefaultLogger{}
func newLogEntry(level logrus.Level) *logrus.Entry {
entry := logrus.New()
entry.SetLevel(level)
// configure the formatter
entry.SetFormatter(&logrus.TextFormatter{
DisableTimestamp: false,
ForceColors: true,
DisableLevelTruncation: true,
})
return logrus.NewEntry(entry)
}
func init() {
switch os.Getenv("LOGLEVEL") {
case "Trace":
globalLogLevel = logrus.TraceLevel
case "Debug":
globalLogLevel = logrus.DebugLevel
case "Info":
globalLogLevel = logrus.InfoLevel
default:
globalLogLevel = logrus.WarnLevel
}
}