diff --git a/cmd/server/app/root.go b/cmd/server/app/root.go index dccf9a82781ec80b87d814cfb448349864312d22..248bdaa3fefe817ce15a94c2267a72a173c9f057 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 be053ccbabee4ada4633fdc487b5ef1511b791b5..2c85ee1746b33bb0678890a8ce3aff8b8c0aee37 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 5dc9a5e009a0f034e93b4055e58e1863ef6f7735..82bed39b516508c1507ba67f95e6cefc937804b9 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 e399ae5089074f1779bb462992f8d6408d10675d..668cbc6f5f8eb2eaad790bca3d538a93ac77f01c 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 84fde0e043734b6b9af7f7748d9e440f0c76ad33..f0ba37b3205d8992223ad1bcded9d2cf9ecc5043 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 094471ce76693a2de1bfa8a0167c17f25e0cc9da..839c53434f1d2b9cb12b55cceeaee5c7cd8004a6 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 {