From f2d95bbf8099b19d748cd0d94397bd658abea13e Mon Sep 17 00:00:00 2001 From: Stefan Prodan Date: Mon, 20 Aug 2018 17:03:07 +0300 Subject: [PATCH] Add logging middleware and log level option --- cmd/podinfo/main.go | 77 ++++++++++++++++++++++++++++-------------- pkg/api/logging.go | 31 +++++++++++++++++ pkg/api/server.go | 2 ++ pkg/version/version.go | 2 +- 4 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 pkg/api/logging.go diff --git a/cmd/podinfo/main.go b/cmd/podinfo/main.go index 5eec9dd..469676b 100644 --- a/cmd/podinfo/main.go +++ b/cmd/podinfo/main.go @@ -21,6 +21,7 @@ func main() { // flags definition fs := pflag.NewFlagSet("default", pflag.ContinueOnError) fs.Int("port", 9898, "port") + fs.String("level", "info", "log level debug, info, warn, error, flat or panic") fs.String("backend-url", "", "backend service URL") fs.Duration("http-client-timeout", 2*time.Minute, "client timeout duration") fs.Duration("http-server-timeout", 30*time.Second, "server read and write timeout duration") @@ -60,33 +61,10 @@ func main() { viper.AutomaticEnv() // configure logging - zapEncoderConfig := zapcore.EncoderConfig{ - TimeKey: "ts", - LevelKey: "level", - NameKey: "logger", - CallerKey: "caller", - MessageKey: "msg", - StacktraceKey: "stacktrace", - LineEnding: zapcore.DefaultLineEnding, - EncodeLevel: zapcore.LowercaseLevelEncoder, - EncodeTime: zapcore.ISO8601TimeEncoder, - EncodeDuration: zapcore.SecondsDurationEncoder, - EncodeCaller: zapcore.ShortCallerEncoder, - } - zapConfig := zap.Config{ - Level: zap.NewAtomicLevelAt(zapcore.InfoLevel), - Development: false, - Sampling: &zap.SamplingConfig{ - Initial: 100, - Thereafter: 100, - }, - Encoding: "json", - EncoderConfig: zapEncoderConfig, - OutputPaths: []string{"stderr"}, - ErrorOutputPaths: []string{"stderr"}, - } - logger, _ := zapConfig.Build() + logger, _ := initZap(viper.GetString("level")) defer logger.Sync() + stdLog := zap.RedirectStdLog(logger) + defer stdLog() // log version and port logger.Info("Starting podinfo", @@ -119,6 +97,53 @@ func main() { srv.ListenAndServe(stopCh) } +func initZap(logLevel string) (*zap.Logger, error) { + level := zap.NewAtomicLevelAt(zapcore.InfoLevel) + switch logLevel { + case "debug": + level = zap.NewAtomicLevelAt(zapcore.DebugLevel) + case "info": + level = zap.NewAtomicLevelAt(zapcore.InfoLevel) + case "warn": + level = zap.NewAtomicLevelAt(zapcore.WarnLevel) + case "error": + level = zap.NewAtomicLevelAt(zapcore.ErrorLevel) + case "fatal": + level = zap.NewAtomicLevelAt(zapcore.FatalLevel) + case "panic": + level = zap.NewAtomicLevelAt(zapcore.PanicLevel) + } + + zapEncoderConfig := zapcore.EncoderConfig{ + TimeKey: "ts", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "msg", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } + + zapConfig := zap.Config{ + Level: level, + Development: false, + Sampling: &zap.SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + Encoding: "json", + EncoderConfig: zapEncoderConfig, + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } + + return zapConfig.Build() +} + var stressMemoryPayload []byte func beginStressTest(cpus int, mem int, logger *zap.Logger) { diff --git a/pkg/api/logging.go b/pkg/api/logging.go new file mode 100644 index 0000000..47e5c2b --- /dev/null +++ b/pkg/api/logging.go @@ -0,0 +1,31 @@ +package api + +import ( + "net/http" + + "go.uber.org/zap" +) + +type LoggingMiddleware struct { + logger *zap.Logger +} + +func NewLoggingMiddleware(logger *zap.Logger) *LoggingMiddleware { + return &LoggingMiddleware{ + logger: logger, + } +} + +func (m *LoggingMiddleware) Handler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + m.logger.Debug( + "request started", + zap.String("proto", r.Proto), + zap.String("uri", r.RequestURI), + zap.String("method", r.Method), + zap.String("remote", r.RemoteAddr), + zap.String("user-agent", r.UserAgent()), + ) + next.ServeHTTP(w, r) + }) +} diff --git a/pkg/api/server.go b/pkg/api/server.go index d35b5de..37055af 100644 --- a/pkg/api/server.go +++ b/pkg/api/server.go @@ -76,6 +76,8 @@ func (s *Server) registerHandlers() { func (s *Server) registerMiddlewares() { prom := NewPrometheusMiddleware() s.router.Use(prom.Handler) + zapLog := NewLoggingMiddleware(s.logger) + s.router.Use(zapLog.Handler) s.router.Use(versionMiddleware) } diff --git a/pkg/version/version.go b/pkg/version/version.go index 4961393..2d9f563 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -1,4 +1,4 @@ package version -var VERSION = "1.0.0-alpha.1" +var VERSION = "1.0.0-alpha.2" var REVISION = "unknown"