From 4d30b9de09e4b7298718d04ccc104f81e76d4290 Mon Sep 17 00:00:00 2001 From: Matt Stephenson Date: Wed, 26 Sep 2018 16:04:55 -0700 Subject: [PATCH] Add support for json formatted logs (#1245) --- api/common/logging.go | 21 ++++++++++++++++----- api/server/server.go | 15 +++++++++++++++ api/server/server_test.go | 1 + test/fn-system-tests/system_test.go | 3 +++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/api/common/logging.go b/api/common/logging.go index 7e10cfe9a..a482a48d5 100644 --- a/api/common/logging.go +++ b/api/common/logging.go @@ -9,15 +9,26 @@ import ( "strings" ) +func SetLogFormat(format string) { + if format != "text" && format != "json" { + logrus.WithFields(logrus.Fields{"format": format}).Warn("Unknown log format specified, using text. Possible options are json and text.") + } + + if format == "json" { + logrus.SetFormatter(&logrus.JSONFormatter{}) + } else { + // show full timestamps + formatter := &logrus.TextFormatter{ + FullTimestamp: true, + } + logrus.SetFormatter(formatter) + } +} + func SetLogLevel(ll string) { if ll == "" { ll = "info" } - // show full timestamps - formatter := &logrus.TextFormatter{ - FullTimestamp: true, - } - logrus.SetFormatter(formatter) logrus.WithFields(logrus.Fields{"level": ll}).Info("Setting log level to") logLevel, err := logrus.ParseLevel(ll) diff --git a/api/server/server.go b/api/server/server.go index e20c47faa..84ac5be7d 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -48,6 +48,9 @@ const ( // forcing usage through WithXxx configuration methods and documenting there vs. // expecting users to use os.SetEnv(EnvLogLevel, "debug") // why ? + // EnvLogFormat sets the stderr logging format, text or json only + EnvLogFormat = "FN_LOG_FORMAT" + // EnvLogLevel sets the stderr logging level EnvLogLevel = "FN_LOG_LEVEL" @@ -116,6 +119,9 @@ const ( // EnvMaxRequestSize sets the limit in bytes for any API request's length. EnvMaxRequestSize = "FN_MAX_REQUEST_SIZE" + // DefaultLogFormat is text + DefaultLogFormat = "text" + // DefaultLogLevel is info DefaultLogLevel = "info" @@ -246,6 +252,7 @@ func NewFromEnv(ctx context.Context, opts ...Option) *Server { } opts = append(opts, WithWebPort(getEnvInt(EnvPort, DefaultPort))) opts = append(opts, WithGRPCPort(getEnvInt(EnvGRPCPort, DefaultGRPCPort))) + opts = append(opts, WithLogFormat(getEnv(EnvLogFormat, DefaultLogFormat))) opts = append(opts, WithLogLevel(getEnv(EnvLogLevel, DefaultLogLevel))) opts = append(opts, WithLogDest(getEnv(EnvLogDest, DefaultLogDest), getEnv(EnvLogPrefix, ""))) opts = append(opts, WithZipkin(getEnv(EnvZipkinURL, ""))) @@ -309,6 +316,14 @@ func WithGRPCPort(port int) Option { } } +// WithLogFormat maps EnvLogFormat +func WithLogFormat(format string) Option { + return func(ctx context.Context, s *Server) error { + common.SetLogFormat(format) + return nil + } +} + // WithLogLevel maps EnvLogLevel func WithLogLevel(ll string) Option { return func(ctx context.Context, s *Server) error { diff --git a/api/server/server_test.go b/api/server/server_test.go index 152d03070..8446cdf74 100644 --- a/api/server/server_test.go +++ b/api/server/server_test.go @@ -19,6 +19,7 @@ import ( func testServer(ds models.Datastore, mq models.MessageQueue, logDB models.LogStore, rnr agent.Agent, nodeType NodeType, opts ...Option) *Server { return New(context.Background(), append(opts, + WithLogFormat("text"), WithLogLevel("debug"), WithDatastore(ds), WithMQ(mq), diff --git a/test/fn-system-tests/system_test.go b/test/fn-system-tests/system_test.go index cf1c5b97c..f06370de8 100644 --- a/test/fn-system-tests/system_test.go +++ b/test/fn-system-tests/system_test.go @@ -179,6 +179,7 @@ func SetUpAPINode(ctx context.Context) (*server.Server, error) { opts := make([]server.Option, 0) opts = append(opts, server.WithWebPort(8085)) opts = append(opts, server.WithType(nodeType)) + opts = append(opts, server.WithLogFormat(getEnv(server.EnvLogFormat, server.DefaultLogFormat))) opts = append(opts, server.WithLogLevel(getEnv(server.EnvLogLevel, server.DefaultLogLevel))) opts = append(opts, server.WithLogDest(getEnv(server.EnvLogDest, server.DefaultLogDest), "API")) opts = append(opts, server.WithDBURL(getEnv(server.EnvDBURL, defaultDB))) @@ -196,6 +197,7 @@ func SetUpLBNode(ctx context.Context) (*server.Server, error) { opts := make([]server.Option, 0) opts = append(opts, server.WithWebPort(8081)) opts = append(opts, server.WithType(nodeType)) + opts = append(opts, server.WithLogFormat(getEnv(server.EnvLogFormat, server.DefaultLogFormat))) opts = append(opts, server.WithLogLevel(getEnv(server.EnvLogLevel, server.DefaultLogLevel))) opts = append(opts, server.WithLogDest(getEnv(server.EnvLogDest, server.DefaultLogDest), "LB")) opts = append(opts, server.WithDBURL("")) @@ -243,6 +245,7 @@ func SetUpPureRunnerNode(ctx context.Context, nodeNum int) (*server.Server, erro opts = append(opts, server.WithWebPort(8082+nodeNum)) opts = append(opts, server.WithGRPCPort(9190+nodeNum)) opts = append(opts, server.WithType(nodeType)) + opts = append(opts, server.WithLogFormat(getEnv(server.EnvLogFormat, server.DefaultLogFormat))) opts = append(opts, server.WithLogLevel(getEnv(server.EnvLogLevel, server.DefaultLogLevel))) opts = append(opts, server.WithLogDest(getEnv(server.EnvLogDest, server.DefaultLogDest), "PURE-RUNNER")) opts = append(opts, server.WithDBURL(""))