From 25e6227822ad6d9b0c7676ed32500ca2349fdf2a Mon Sep 17 00:00:00 2001 From: Dan Lorenc <dlorenc@google.com> Date: Wed, 27 Jan 2021 07:56:54 -0600 Subject: [PATCH] Add a production logging configuration and a flag. This is only toggled on for the server right now. --- cmd/server/app/root.go | 2 ++ cmd/server/app/serve.go | 3 +++ config/rekor.yaml | 3 ++- docker-compose.yml | 2 ++ .../restapi/configure_rekor_server.go | 10 +++++++++ pkg/log/log.go | 21 +++++++++++++------ 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/cmd/server/app/root.go b/cmd/server/app/root.go index dccf9a8..248bdaa 100644 --- a/cmd/server/app/root.go +++ b/cmd/server/app/root.go @@ -28,6 +28,7 @@ import ( ) var cfgFile string +var logType string // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ @@ -57,6 +58,7 @@ func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.rekor-server.yaml)") + rootCmd.PersistentFlags().StringVar(&logType, "log_type", "dev", "logger type to use (dev/prod)") rootCmd.PersistentFlags().String("trillian_log_server.address", "127.0.0.1", "Trillian log server address") rootCmd.PersistentFlags().Uint16("trillian_log_server.port", 8091, "Trillian log server port") diff --git a/cmd/server/app/serve.go b/cmd/server/app/serve.go index be053cc..2c85ee1 100644 --- a/cmd/server/app/serve.go +++ b/cmd/server/app/serve.go @@ -38,6 +38,9 @@ var serveCmd = &cobra.Command{ Long: `Starts a http server and serves the configured api`, Run: func(cmd *cobra.Command, args []string) { + // Setup the logger to dev/prod + log.ConfigureLogger(viper.GetString("log_type")) + // workaround for https://github.com/projectrekor/rekor/issues/68 // from https://github.com/golang/glog/commit/fca8c8854093a154ff1eb580aae10276ad6b1b5f _ = flag.CommandLine.Parse([]string{}) diff --git a/config/rekor.yaml b/config/rekor.yaml index 5dc9a5e..82bed39 100644 --- a/config/rekor.yaml +++ b/config/rekor.yaml @@ -25,7 +25,8 @@ spec: "--trillian_log_server.port=8091", "--rekor_server.address=0.0.0.0", "--redis_server.address=10.234.175.59", - "--redis_server.port=6379" + "--redis_server.port=6379", + "--log_type=prod", ] resources: requests: diff --git a/docker-compose.yml b/docker-compose.yml index e399ae5..668cbc6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,6 +61,8 @@ services: "--redis_server.address=redis-server", "--redis_server.port=6379", "--rekor_server.address=0.0.0.0", + # Uncomment this for production logging + # "--log_type=prod", ] restart: always # keep the server running ports: diff --git a/pkg/generated/restapi/configure_rekor_server.go b/pkg/generated/restapi/configure_rekor_server.go index 84fde0e..f0ba37b 100644 --- a/pkg/generated/restapi/configure_rekor_server.go +++ b/pkg/generated/restapi/configure_rekor_server.go @@ -119,9 +119,19 @@ func setupMiddlewares(handler http.Handler) http.Handler { return handler } +// We need this type to act as an adapter between zap and the middleware request logger. +type logAdapter struct { +} + +func (l *logAdapter) Print(v ...interface{}) { + log.Logger.Info(v...) +} + // The middleware configuration happens before anything, this middleware also applies to serving the swagger.json document. // So this is a good place to plug in a panic handling middleware, logging and metrics func setupGlobalMiddleware(handler http.Handler) http.Handler { + middleware.DefaultLogger = middleware.RequestLogger( + &middleware.DefaultLogFormatter{Logger: &logAdapter{}}) returnHandler := middleware.Logger(handler) returnHandler = middleware.Recoverer(returnHandler) returnHandler = middleware.Heartbeat("/ping")(returnHandler) diff --git a/pkg/log/log.go b/pkg/log/log.go index 094471c..839c534 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -10,17 +10,26 @@ import ( "go.uber.org/zap/zapcore" ) -var Logger = createGlobalLogger() +// Set the default logger to development mode +var Logger *zap.SugaredLogger -func createGlobalLogger() *zap.SugaredLogger { - cfg := zap.NewDevelopmentConfig() - cfg.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder +func init() { + ConfigureLogger("dev") +} + +func ConfigureLogger(logType string) { + var cfg zap.Config + if logType == "prod" { + cfg = zap.NewProductionConfig() + } else { + cfg = zap.NewDevelopmentConfig() + cfg.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder + } logger, err := cfg.Build() if err != nil { log.Fatalln("createLogger", err) } - - return logger.Sugar() + Logger = logger.Sugar() } func WithRequestID(ctx context.Context, id string) context.Context { -- GitLab