From c53ada95eb2427da65f86412c013f3e48de27243 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 22 Jan 2024 14:49:58 +0300 Subject: [PATCH] logs-fix-3 --- server/logs/fmt.go | 60 +++++++++++++++++++++++++++++++++++++++++++++ server/logs/logs.go | 2 +- server/main.go | 2 +- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 server/logs/fmt.go diff --git a/server/logs/fmt.go b/server/logs/fmt.go new file mode 100644 index 0000000..fdff3ab --- /dev/null +++ b/server/logs/fmt.go @@ -0,0 +1,60 @@ +package logs + +import ( + "encoding/json" + "fmt" + "time" + + "github.com/sirupsen/logrus" +) + +// LogJSONFormatter is a custom log formatter for JSON output +type LogJSONFormatter struct { +} + +// Format formats the log entry to JSON +func (f *LogJSONFormatter) Format(entry *logrus.Entry) ([]byte, error) { + data := make(logrus.Fields) + + // Include the log level, message, and time in the JSON output + data["level"] = entry.Level.String() + data["msg"] = entry.Message + data["time"] = entry.Time.UTC().Format(time.RFC3339) + + // Include additional fields from the entry + for k, v := range entry.Data { + data[k] = v + } + + // Marshal the JSON data + jsonData, err := json.Marshal(data) + if err != nil { + return nil, fmt.Errorf("failed to marshal log entry to JSON: %v", err) + } + + // Append a newline to the JSON data + return append(jsonData, '\n'), nil +} + +// ParseLogLine parses the log line and extracts the log level, message, and time +func ParseLogLine(line string) (logrus.Level, string, time.Time, error) { + var entry struct { + Level string `json:"level"` + Msg string `json:"msg"` + Time time.Time `json:"time"` + } + + // Unmarshal the JSON data + err := json.Unmarshal([]byte(line), &entry) + if err != nil { + return logrus.InfoLevel, "", time.Time{}, fmt.Errorf("failed to unmarshal log line: %v", err) + } + + // Convert the log level string to logrus.Level + level, err := logrus.ParseLevel(entry.Level) + if err != nil { + return logrus.InfoLevel, "", time.Time{}, fmt.Errorf("failed to parse log level: %v", err) + } + + return level, entry.Msg, entry.Time, nil +} diff --git a/server/logs/logs.go b/server/logs/logs.go index 31fa111..449f050 100644 --- a/server/logs/logs.go +++ b/server/logs/logs.go @@ -22,7 +22,7 @@ func InitLog(cliLogLevel string) *log.Logger { // log instance for gin server log := logrus.New() - log.SetFormatter(LogUTCFormatter{&logrus.TextFormatter{}}) + log.SetFormatter(&LogJSONFormatter{}) if cliLogLevel == "" { cliLogLevel = os.Getenv("LOG_LEVEL") diff --git a/server/main.go b/server/main.go index 0348d2a..b801e33 100644 --- a/server/main.go +++ b/server/main.go @@ -28,7 +28,7 @@ func main() { flag.Parse() // global log level - logrus.SetFormatter(logs.LogUTCFormatter{&logrus.JSONFormatter{}}) + logrus.SetFormatter(&logs.LogJSONFormatter{}) constants.VERSION = VERSION