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 }