From 692c721854e4667102778e8e69e3dd12e47984b5 Mon Sep 17 00:00:00 2001
From: Alex Stockinger <mail@alexstockinger.de>
Date: Thu, 8 Oct 2020 15:32:15 +0200
Subject: [PATCH] Introduce ENABLE_JSON_LOGGING env variable (#1158)

---
 charts/postgres-operator/templates/deployment.yaml | 4 ++++
 charts/postgres-operator/values.yaml               | 3 +++
 cmd/main.go                                        | 7 ++++++-
 docs/reference/command_line_and_environment.md     | 4 ++++
 pkg/controller/controller.go                       | 3 +++
 pkg/spec/types.go                                  | 2 ++
 6 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/charts/postgres-operator/templates/deployment.yaml b/charts/postgres-operator/templates/deployment.yaml
index 2d8eebcb..9841bf1b 100644
--- a/charts/postgres-operator/templates/deployment.yaml
+++ b/charts/postgres-operator/templates/deployment.yaml
@@ -37,6 +37,10 @@ spec:
         image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}"
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         env:
+      {{- if .Values.enableJsonLogging }}
+        - name: ENABLE_JSON_LOGGING
+          value: "true"
+      {{- end }}
       {{- if eq .Values.configTarget "ConfigMap" }}
         - name: CONFIG_MAP_NAME
           value: {{ template "postgres-operator.fullname" . }}
diff --git a/charts/postgres-operator/values.yaml b/charts/postgres-operator/values.yaml
index 37eac425..d4acfe1a 100644
--- a/charts/postgres-operator/values.yaml
+++ b/charts/postgres-operator/values.yaml
@@ -15,6 +15,9 @@ podLabels: {}
 
 configTarget: "ConfigMap"
 
+# JSON logging format
+enableJsonLogging: false
+
 # general configuration parameters
 configGeneral:
   # choose if deployment creates/updates CRDs with OpenAPIV3Validation
diff --git a/cmd/main.go b/cmd/main.go
index a178c187..376df0ba 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -2,7 +2,7 @@ package main
 
 import (
 	"flag"
-	"log"
+	log "github.com/sirupsen/logrus"
 	"os"
 	"os/signal"
 	"sync"
@@ -36,6 +36,8 @@ func init() {
 	flag.BoolVar(&config.NoTeamsAPI, "noteamsapi", false, "Disable all access to the teams API")
 	flag.Parse()
 
+	config.EnableJsonLogging = os.Getenv("ENABLE_JSON_LOGGING") == "true"
+
 	configMapRawName := os.Getenv("CONFIG_MAP_NAME")
 	if configMapRawName != "" {
 
@@ -63,6 +65,9 @@ func init() {
 func main() {
 	var err error
 
+	if config.EnableJsonLogging {
+		log.SetFormatter(&log.JSONFormatter{})
+	}
 	log.SetOutput(os.Stdout)
 	log.Printf("Spilo operator %s\n", version)
 
diff --git a/docs/reference/command_line_and_environment.md b/docs/reference/command_line_and_environment.md
index ece29b09..35f47cab 100644
--- a/docs/reference/command_line_and_environment.md
+++ b/docs/reference/command_line_and_environment.md
@@ -56,3 +56,7 @@ The following environment variables are accepted by the operator:
 * **CRD_READY_WAIT_INTERVAL**
   defines the  interval between consecutive attempts waiting for the
   `postgresql` CRD to be created. The default is 5s.
+  
+* **ENABLE_JSON_LOGGING**
+  Set to `true` for JSON formatted logging output.
+  The default is false.
diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go
index aa996288..8e9f0202 100644
--- a/pkg/controller/controller.go
+++ b/pkg/controller/controller.go
@@ -71,6 +71,9 @@ type Controller struct {
 // NewController creates a new controller
 func NewController(controllerConfig *spec.ControllerConfig, controllerId string) *Controller {
 	logger := logrus.New()
+	if controllerConfig.EnableJsonLogging {
+		logger.SetFormatter(&logrus.JSONFormatter{})
+	}
 
 	var myComponentName = "postgres-operator"
 	if controllerId != "" {
diff --git a/pkg/spec/types.go b/pkg/spec/types.go
index 7a2c0dda..78c79e1b 100644
--- a/pkg/spec/types.go
+++ b/pkg/spec/types.go
@@ -114,6 +114,8 @@ type ControllerConfig struct {
 	CRDReadyWaitTimeout  time.Duration
 	ConfigMapName        NamespacedName
 	Namespace            string
+
+	EnableJsonLogging bool
 }
 
 // cached value for the GetOperatorNamespace
-- 
GitLab