From 7d767b809419ea51d71d2dc83084e797db9a965d Mon Sep 17 00:00:00 2001 From: Javier Marcos <1271349+javuto@users.noreply.github.com> Date: Thu, 27 Jan 2022 00:25:06 +0100 Subject: [PATCH] Adding status, result and query logger for external file --- go.mod | 1 + go.sum | 2 + logging/file.go | 91 ++++++++++++++++++++++++++++++++++++++++++++ logging/logging.go | 30 +++++++++++++++ logging/stdout.go | 16 ++++---- settings/settings.go | 1 + 6 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 logging/file.go diff --git a/go.mod b/go.mod index 348f1618..f288505f 100644 --- a/go.mod +++ b/go.mod @@ -96,5 +96,6 @@ require ( golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect golang.org/x/text v0.3.7 // indirect gopkg.in/ini.v1 v1.66.3 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index c2f65f89..ee01a086 100644 --- a/go.sum +++ b/go.sum @@ -848,6 +848,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/logging/file.go b/logging/file.go new file mode 100644 index 00000000..dfc15ac9 --- /dev/null +++ b/logging/file.go @@ -0,0 +1,91 @@ +package logging + +import ( + "log" + + "github.com/jmpsec/osctrl/settings" + "github.com/jmpsec/osctrl/types" + "github.com/rs/zerolog" + lumberjack "gopkg.in/natefinch/lumberjack.v2" +) + +// LumberjackConfig to keep configuration for rotating logs +type LumberjackConfig struct { + // Maximum size in megabytes of the log file before it gets rotated + MaxSize int + // Maximum number of old log files to retain + MaxBackups int + // Maximum number of days to retain old log files based on the timestamp encoded in their filename + MaxAge int + // If the rotated log files should be compressed using gzip + Compress bool +} + +// LoggerFile will be used to log data using external file +type LoggerFile struct { + Enabled bool + Filename string + Logger *zerolog.Logger +} + +// CreateLoggerFile to initialize the logger +func CreateLoggerFile(filename string, cfg LumberjackConfig) (*LoggerFile, error) { + zerolog.TimeFieldFormat = zerolog.TimeFormatUnix + z := zerolog.New(&lumberjack.Logger{ + Filename: filename, + MaxSize: cfg.MaxSize, + MaxBackups: cfg.MaxBackups, + MaxAge: cfg.MaxAge, + Compress: cfg.Compress, + }) + logger := z.With().Caller().Timestamp().Logger() + return &LoggerFile{ + Enabled: true, + Filename: filename, + Logger: &logger, + }, nil +} + +// Settings - Function to prepare settings for the logger +func (logFile *LoggerFile) Settings(mgr *settings.Settings) { + log.Printf("No stdout logging settings\n") +} + +// Log - Function that sends JSON result/status/query logs to stdout +func (logFile *LoggerFile) Log(logType string, data []byte, environment, uuid string, debug bool) { + if debug { + log.Printf("Sending %d bytes to stdout for %s - %s", len(data), environment, uuid) + } + switch logType { + case types.StatusLog: + logFile.Status(data, environment, uuid, debug) + case types.ResultLog: + logFile.Result(data, environment, uuid, debug) + } +} + +// Status - Function that sends JSON status logs to stdout +func (logFile *LoggerFile) Status(data []byte, environment, uuid string, debug bool) { + logFile.Logger.Info().Str( + "type", types.StatusLog).Str( + "environment", environment).Str( + "uuid", uuid).RawJSON("data", data) +} + +// Result - Function that sends JSON result logs to stdout +func (logFile *LoggerFile) Result(data []byte, environment, uuid string, debug bool) { + logFile.Logger.Info().Str( + "type", types.ResultLog).Str( + "environment", environment).Str( + "uuid", uuid).RawJSON("data", data) +} + +// Query - Function that sends JSON query logs to stdout +func (logFile *LoggerFile) Query(data []byte, environment, uuid, name string, status int, debug bool) { + logFile.Logger.Info().Str( + "type", types.QueryLog).Str( + "environment", environment).Str( + "name", name).Int( + "status", status).Str( + "uuid", uuid).RawJSON("data", data) +} diff --git a/logging/logging.go b/logging/logging.go index 95c21984..55ecd188 100644 --- a/logging/logging.go +++ b/logging/logging.go @@ -52,6 +52,20 @@ func CreateLoggerTLS(logging, loggingFile string, mgr *settings.Settings, nodes } d.Settings(mgr) l.Logger = d + case settings.LoggingFile: + // TODO: All this should be customizable + rotateCfg := LumberjackConfig{ + MaxSize: 25, + MaxBackups: 5, + MaxAge: 10, + Compress: true, + } + d, err := CreateLoggerFile("osctrl.log", rotateCfg) + if err != nil { + return nil, err + } + d.Settings(mgr) + l.Logger = d } // Initialize the DB logger anyway return l, nil @@ -92,6 +106,14 @@ func (logTLS *LoggerTLS) Log(logType string, data []byte, environment, uuid stri if l.Enabled { l.Log(logType, data, environment, uuid, debug) } + case settings.LoggingFile: + l, ok := logTLS.Logger.(LoggerFile) + if !ok { + log.Printf("error casting logger to %s", settings.LoggingFile) + } + if l.Enabled { + l.Log(logType, data, environment, uuid, debug) + } } } @@ -130,5 +152,13 @@ func (logTLS *LoggerTLS) QueryLog(logType string, data []byte, environment, uuid if l.Enabled { l.Query(data, environment, uuid, name, status, debug) } + case settings.LoggingFile: + l, ok := logTLS.Logger.(LoggerFile) + if !ok { + log.Printf("error casting logger to %s", settings.LoggingFile) + } + if l.Enabled { + l.Query(data, environment, uuid, name, status, debug) + } } } diff --git a/logging/stdout.go b/logging/stdout.go index 81005380..e78c0ba8 100644 --- a/logging/stdout.go +++ b/logging/stdout.go @@ -47,24 +47,24 @@ func (logStdout *LoggerStdout) Log(logType string, data []byte, environment, uui func (logStdout *LoggerStdout) Status(data []byte, environment, uuid string, debug bool) { logStdout.Logger.Info().Str( "type", types.StatusLog).Str( - "environment", environment).Str( - "uuid", uuid).RawJSON("data", data) + "environment", environment).Str( + "uuid", uuid).RawJSON("data", data) } // Result - Function that sends JSON result logs to stdout func (logStdout *LoggerStdout) Result(data []byte, environment, uuid string, debug bool) { logStdout.Logger.Info().Str( "type", types.ResultLog).Str( - "environment", environment).Str( - "uuid", uuid).RawJSON("data", data) + "environment", environment).Str( + "uuid", uuid).RawJSON("data", data) } // Query - Function that sends JSON query logs to stdout func (logStdout *LoggerStdout) Query(data []byte, environment, uuid, name string, status int, debug bool) { logStdout.Logger.Info().Str( "type", types.QueryLog).Str( - "environment", environment).Str( - "name", name).Int( - "status", status).Str( - "uuid", uuid).RawJSON("data", data) + "environment", environment).Str( + "name", name).Int( + "status", status).Str( + "uuid", uuid).RawJSON("data", data) } diff --git a/settings/settings.go b/settings/settings.go index 4721c0e4..891742e3 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -35,6 +35,7 @@ const ( const ( LoggingNone string = "none" LoggingStdout string = "stdout" + LoggingFile string = "file" LoggingDB string = "db" LoggingGraylog string = "graylog" LoggingSplunk string = "splunk"