diff --git a/logs/logs.go b/logs/logs.go index 5407d1fd344b1df2818f6bbfa58a43fc3f65c9d4..b1f8ef62a15d2ac7983be2251eaecef2db8cbfbc 100644 --- a/logs/logs.go +++ b/logs/logs.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + log "github.com/sirupsen/logrus" "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors" "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/string_utils" "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils" @@ -19,21 +20,22 @@ import ( "github.com/MindscapeHQ/raygun4go" "github.com/aws/aws-lambda-go/events" - log "github.com/sirupsen/logrus" ) -type LogBufferWithLevel struct { - LogBuffer *bytes.Buffer - LogLevel log.Level +type LogEntryWithLevel struct { + //LogBuffer *bytes.Buffer + LogEntry *log.Entry + Message interface{} + LogLevel log.Level } var logger *log.Entry -var logBuffers []LogBufferWithLevel +var cachedLogEntries []LogEntryWithLevel var apiRequest *events.APIGatewayProxyRequest var currentRequestID *string var isDebug = false -var logToBuffer = false +var storeLogsUntilTriggered = false var disableLogging = false var build string var raygunClient *raygun4go.Client @@ -183,9 +185,12 @@ func InfoWithFields(fields map[string]interface{}, message interface{}) { } sanitisedFields := SanitiseFields(fields) - logBuffer := CheckToGetLogBuffer() - getLogger().WithFields(sanitisedFields).Info(message) - CheckToStoreLogBuffer(logBuffer, log.InfoLevel) + logEntry := getLogger().WithFields(sanitisedFields) + if storeLogsUntilTriggered { + storeLogEntry(logEntry, message, log.InfoLevel) + } else { + logEntry.Info(message) + } } func Info(format string, a ...interface{}) { @@ -195,9 +200,12 @@ func Info(format string, a ...interface{}) { message := SanitiseLogs(fmt.Sprintf(format, a...)) - logBuffer := CheckToGetLogBuffer() - getLogger().Info(message) - CheckToStoreLogBuffer(logBuffer, log.InfoLevel) + logEntry := getLogger() + if storeLogsUntilTriggered { + storeLogEntry(logEntry, message, log.InfoLevel) + } else { + logEntry.Info(message) + } } func ErrorWithFields(fields map[string]interface{}, err error) { @@ -208,9 +216,12 @@ func ErrorWithFields(fields map[string]interface{}, err error) { sanitisedFields := SanitiseFields(fields) sendRaygunError(sanitisedFields, err) - logBuffer := CheckToGetLogBuffer() - getLogger().WithFields(sanitisedFields).Error(err) - CheckToStoreLogBuffer(logBuffer, log.ErrorLevel) + logEntry := getLogger().WithFields(sanitisedFields) + if storeLogsUntilTriggered { + storeLogEntry(logEntry, err, log.ErrorLevel) + } else { + logEntry.Error(err) + } } func ErrorWithMsg(message string, err error) { @@ -241,9 +252,12 @@ func Warn(format string, a ...interface{}) { message := SanitiseLogs(fmt.Sprintf(format, a...)) - logBuffer := CheckToGetLogBuffer() - getLogger().Warn(message) - CheckToStoreLogBuffer(logBuffer, log.WarnLevel) + logEntry := getLogger() + if storeLogsUntilTriggered { + storeLogEntry(logEntry, message, log.WarnLevel) + } else { + logEntry.Warn(message) + } } func WarnWithFields(fields map[string]interface{}, err error) { @@ -252,9 +266,13 @@ func WarnWithFields(fields map[string]interface{}, err error) { } sanitisedFields := SanitiseFields(fields) - logBuffer := CheckToGetLogBuffer() - getLogger().WithFields(sanitisedFields).Warn(err) - CheckToStoreLogBuffer(logBuffer, log.WarnLevel) + + logEntry := getLogger().WithFields(sanitisedFields) + if storeLogsUntilTriggered { + storeLogEntry(logEntry, err, log.WarnLevel) + } else { + logEntry.Warn(err) + } } func SQLDebugInfo(sql string) { @@ -262,11 +280,14 @@ func SQLDebugInfo(sql string) { return } - logBuffer := CheckToGetLogBuffer() - getLogger().WithFields(map[string]interface{}{ + logEntry := getLogger().WithFields(map[string]interface{}{ "sql": sql, - }).Debug("SQL query") - CheckToStoreLogBuffer(logBuffer, log.InfoLevel) + }) + if storeLogsUntilTriggered { + storeLogEntry(logEntry, "SQL query", log.DebugLevel) + } else { + logEntry.Debug("SQL query") + } } func LogShipmentID(id int64) { @@ -335,9 +356,12 @@ func LogApiAudit(fields log.Fields) { return } - logBuffer := CheckToGetLogBuffer() - getLogger().WithFields(fields).Info("api-audit-log") - CheckToStoreLogBuffer(logBuffer, log.InfoLevel) + logEntry := getLogger().WithFields(fields) + if storeLogsUntilTriggered { + storeLogEntry(logEntry, "api-audit-log", log.InfoLevel) + } else { + logEntry.Info("api-audit-log") + } } func LogSQSEvent(event events.SQSEvent) { @@ -375,8 +399,8 @@ func SetOutputToFile(file *os.File) { log.SetOutput(file) } -func SetOutputToBuffer(outputToLogBuffer bool) { - logToBuffer = outputToLogBuffer +func StoreLogsUntilTriggered(storeLogs bool) { + storeLogsUntilTriggered = storeLogs } func DisableLogging() { @@ -494,37 +518,30 @@ func (f *CustomLogFormatter) Format(entry *log.Entry) ([]byte, error) { return b.Bytes(), nil } -func CheckToGetLogBuffer() *bytes.Buffer { - if logToBuffer { - logBuffer := &bytes.Buffer{} - log.SetOutput(logBuffer) - return logBuffer - } - return nil -} - -func CheckToStoreLogBuffer(logBuffer *bytes.Buffer, logLevel log.Level) { - if logBuffer != nil { - logBuffers = append(logBuffers, LogBufferWithLevel{ - LogBuffer: logBuffer, - LogLevel: logLevel, +func storeLogEntry(logEntry *log.Entry, message interface{}, logLevel log.Level) { + if logEntry != nil && + logEntry.Logger != nil && + logEntry.Logger.IsLevelEnabled(logLevel) { + cachedLogEntries = append(cachedLogEntries, LogEntryWithLevel{ + LogEntry: logEntry, + Message: message, + LogLevel: logLevel, }) } } -func LogAllLogBuffers() { +func LogAllStoredLogs() { log.SetOutput(os.Stderr) - for _, logBuffer := range logBuffers { - switch logBuffer.LogLevel { + for _, cachedLogEntry := range cachedLogEntries { + switch cachedLogEntry.LogLevel { case log.InfoLevel: - getLogger().Info(logBuffer.LogBuffer.String()) + cachedLogEntry.LogEntry.Info(cachedLogEntry.Message) case log.ErrorLevel: - getLogger().Error(logBuffer.LogBuffer.String()) + cachedLogEntry.LogEntry.Error(cachedLogEntry.Message) case log.WarnLevel: - getLogger().Warn(logBuffer.LogBuffer.String()) + cachedLogEntry.LogEntry.Warn(cachedLogEntry.Message) case log.DebugLevel: - getLogger().Debug(logBuffer.LogBuffer.String()) - + cachedLogEntry.LogEntry.Debug(cachedLogEntry.Message) } } }