Skip to content

Commit f494a99

Browse files
authored
cmd/thanos: Extract logger instantiation to pkg/logging (#3342)
Signed-off-by: Frederic Branczyk <fbranczyk@gmail.com>
1 parent f419405 commit f494a99

File tree

2 files changed

+65
-33
lines changed

2 files changed

+65
-33
lines changed

cmd/thanos/main.go

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,42 +23,12 @@ import (
2323
"github.com/prometheus/client_golang/prometheus"
2424
"github.com/prometheus/common/version"
2525
"github.com/thanos-io/thanos/pkg/extkingpin"
26+
"github.com/thanos-io/thanos/pkg/logging"
2627
"github.com/thanos-io/thanos/pkg/tracing/client"
2728
"go.uber.org/automaxprocs/maxprocs"
2829
"gopkg.in/alecthomas/kingpin.v2"
2930
)
3031

31-
const (
32-
logFormatLogfmt = "logfmt"
33-
logFormatJson = "json"
34-
)
35-
36-
func setupLogger(logLevel, logFormat, debugName string) log.Logger {
37-
var lvl level.Option
38-
switch logLevel {
39-
case "error":
40-
lvl = level.AllowError()
41-
case "warn":
42-
lvl = level.AllowWarn()
43-
case "info":
44-
lvl = level.AllowInfo()
45-
case "debug":
46-
lvl = level.AllowDebug()
47-
default:
48-
panic("unexpected log level")
49-
}
50-
logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
51-
if logFormat == logFormatJson {
52-
logger = log.NewJSONLogger(log.NewSyncWriter(os.Stderr))
53-
}
54-
logger = level.NewFilter(logger, lvl)
55-
56-
if debugName != "" {
57-
logger = log.With(logger, "name", debugName)
58-
}
59-
return log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller)
60-
}
61-
6232
func main() {
6333
if os.Getenv("DEBUG") != "" {
6434
runtime.SetMutexProfileFraction(10)
@@ -70,7 +40,7 @@ func main() {
7040
logLevel := app.Flag("log.level", "Log filtering level.").
7141
Default("info").Enum("error", "warn", "info", "debug")
7242
logFormat := app.Flag("log.format", "Log format to use. Possible options: logfmt or json.").
73-
Default(logFormatLogfmt).Enum(logFormatLogfmt, logFormatJson)
43+
Default(logging.LogFormatLogfmt).Enum(logging.LogFormatLogfmt, logging.LogFormatJSON)
7444
tracingConfig := extkingpin.RegisterCommonTracingFlags(app)
7545

7646
registerSidecar(app)
@@ -83,7 +53,14 @@ func main() {
8353
registerQueryFrontend(app)
8454

8555
cmd, setup := app.Parse()
86-
logger := setupLogger(*logLevel, *logFormat, *debugName)
56+
logger := logging.NewLogger(*logFormat, *debugName)
57+
logger, err := logging.WithLogLevel(logger, *logLevel)
58+
if err != nil {
59+
// This log line intentionally does not call the error level
60+
// explicitly, as the log level configuration failed.
61+
logger.Log("level", "error", "err", err)
62+
os.Exit(1)
63+
}
8764

8865
// Running in container with limits but with empty/wrong value of GOMAXPROCS env var could lead to throttling by cpu
8966
// maxprocs will automate adjustment by using cgroups info about cpu limit if it set as value for runtime.GOMAXPROCS.

pkg/logging/logger.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (c) The Thanos Authors.
2+
// Licensed under the Apache License 2.0.
3+
4+
package logging
5+
6+
import (
7+
"fmt"
8+
"os"
9+
10+
"github.com/go-kit/kit/log"
11+
"github.com/go-kit/kit/log/level"
12+
)
13+
14+
const (
15+
LogFormatLogfmt = "logfmt"
16+
LogFormatJSON = "json"
17+
)
18+
19+
// NewLogger returns a log.Logger that prints in the provided format with a UTC
20+
// timestamp and the caller of the log entry.
21+
func NewLogger(logFormat, debugName string) log.Logger {
22+
logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
23+
if logFormat == LogFormatJSON {
24+
logger = log.NewJSONLogger(log.NewSyncWriter(os.Stderr))
25+
}
26+
27+
logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller)
28+
29+
if debugName != "" {
30+
logger = log.With(logger, "name", debugName)
31+
}
32+
33+
return logger
34+
}
35+
36+
// WithLogLevel returns the passed logger with the appropriate log level
37+
// filter. If an unknown log level is passed an error is returned alongside the
38+
// original logger.
39+
func WithLogLevel(logger log.Logger, logLevel string) (log.Logger, error) {
40+
var lvl level.Option
41+
switch logLevel {
42+
case "error":
43+
lvl = level.AllowError()
44+
case "warn":
45+
lvl = level.AllowWarn()
46+
case "info":
47+
lvl = level.AllowInfo()
48+
case "debug":
49+
lvl = level.AllowDebug()
50+
default:
51+
return logger, fmt.Errorf("unexpected log level: %s (expected error, warn, info or debug)", logLevel)
52+
}
53+
54+
return level.NewFilter(logger, lvl), nil
55+
}

0 commit comments

Comments
 (0)