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