package parser import ( "log/slog" "strconv" "strings" "watch-tool/helpers" "watch-tool/models" ) type NginxTJMLogParser struct { ToolName string Hostname string } func (p *NginxTJMLogParser) Parse(line string) (models.LogMessage, error) { entry := models.LogMessage{ Type: "log_entry", Tool: p.ToolName, Raw: line, } entry.Host = p.Hostname entry = p.parseNginxTJM(entry) return entry, nil } func (p *NginxTJMLogParser) parseNginxTJM(entry models.LogMessage) models.LogMessage { newEntry := entry var nginxBase models.NGinXBaseInfo parts := strings.Fields(entry.Raw) if len(parts) < 10 { return newEntry } if len(parts) > 0 { timestampStr := strings.Trim(parts[0], "[]") timestamp, err := helpers.ParseRFC3339WithOptionalZ(timestampStr) if err != nil { slog.Error("unable to parse time", "error", err) } newEntry.Timestamp = timestamp } if len(parts) > 2 { nginxBase.ClientIP = parts[2] } for i, part := range parts { if strings.HasPrefix(part, "\"") { if i+1 < len(parts) { nginxBase.HTTPMethod = strings.Trim(part, "\"") nginxBase.Route = parts[i+1] } break } } for _, part := range parts { if after, ok := strings.CutPrefix(part, "status="); ok { statusCode, err := strconv.ParseInt(after, 10, 64) if err != nil { slog.Error("cant convert statuscode", "error", err) } nginxBase.StatusCode = int(statusCode) break } } newEntry.ServiceInformation = nginxBase return newEntry }