@@ -49,19 +49,16 @@ func init() {
49
49
// InitLogger initialises the global gokit logger (util_log.Logger) and overrides the
50
50
// default logger for the server.
51
51
func InitLogger (cfg * server.Config ) {
52
- l , err := NewPrometheusLogger (cfg .LogLevel , cfg .LogFormat )
53
- if err != nil {
54
- panic (err )
55
- }
52
+ l := newLoggerWithFormat (cfg .LogFormat )
56
53
57
- // when use util_log.Logger, skip 3 stack frames.
58
- Logger = log . With (l , "caller" , log .Caller (3 ))
54
+ // when use util_log.Logger, skip 6 stack frames.
55
+ Logger = newPrometheusLoggerFrom (l , cfg . LogLevel , "caller" , log .Caller (6 ))
59
56
60
- // cfg.Log wraps log function, skip 4 stack frames to get caller information.
57
+ // cfg.Log wraps log function, skip 7 stack frames to get caller information.
61
58
// this works in go 1.12, but doesn't work in versions earlier.
62
59
// it will always shows the wrapper function generated by compiler
63
60
// marked <autogenerated> in old versions.
64
- cfg .Log = logging .GoKit (log . With (l , "caller" , log .Caller (4 )))
61
+ cfg .Log = logging .GoKit (newPrometheusLoggerFrom (l , cfg . LogLevel , "caller" , log .Caller (7 )))
65
62
}
66
63
67
64
// PrometheusLogger exposes Prometheus counters for each of go-kit's log levels.
@@ -72,24 +69,32 @@ type PrometheusLogger struct {
72
69
// NewPrometheusLogger creates a new instance of PrometheusLogger which exposes
73
70
// Prometheus counters for various log levels.
74
71
func NewPrometheusLogger (l logging.Level , format logging.Format ) (log.Logger , error ) {
72
+ logger := newLoggerWithFormat (format )
73
+ return newPrometheusLoggerFrom (logger , l ), nil
74
+ }
75
+
76
+ func newLoggerWithFormat (format logging.Format ) log.Logger {
75
77
logger := log .NewLogfmtLogger (log .NewSyncWriter (os .Stderr ))
76
78
if format .String () == "json" {
77
79
logger = log .NewJSONLogger (log .NewSyncWriter (os .Stderr ))
78
80
}
79
- logger = level .NewFilter (logger , LevelFilter (l .String ()))
81
+ return logger
82
+ }
83
+
84
+ func newPrometheusLoggerFrom (logger log.Logger , logLevel logging.Level , keyvals ... interface {}) log.Logger {
85
+ // Sort the logger chain to avoid expensive log.Valuer evaluation for disallowed level.
86
+ // Ref: https://github.com/go-kit/log/issues/14#issuecomment-945038252
87
+ logger = log .With (logger , "ts" , log .DefaultTimestampUTC )
88
+ logger = log .With (logger , keyvals ... )
89
+ logger = level .NewFilter (logger , LevelFilter (logLevel .String ()))
80
90
81
91
// Initialise counters for all supported levels:
82
92
for _ , level := range supportedLevels {
83
93
logMessages .WithLabelValues (level .String ())
84
94
}
85
-
86
- logger = & PrometheusLogger {
95
+ return & PrometheusLogger {
87
96
logger : logger ,
88
97
}
89
-
90
- // return a Logger without caller information, shouldn't use directly
91
- logger = log .With (logger , "ts" , log .DefaultTimestampUTC )
92
- return logger , nil
93
98
}
94
99
95
100
// Log increments the appropriate Prometheus counter depending on the log level.
0 commit comments