74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package parser
|
|
|
|
import (
|
|
"log/slog"
|
|
"strconv"
|
|
"strings"
|
|
"tixel_watch/helpers"
|
|
"tixel_watch/models"
|
|
)
|
|
|
|
type NginxTJMLogParser struct {
|
|
ToolName string
|
|
}
|
|
|
|
func (p *NginxTJMLogParser) Parse(line string) (models.LogMessage, error) {
|
|
entry := models.LogMessage{
|
|
Type: "log_entry",
|
|
Tool: p.ToolName,
|
|
Raw: line,
|
|
}
|
|
hostname, err := helpers.GetHostname()
|
|
if err != nil {
|
|
return entry, err
|
|
}
|
|
entry.Host = 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
|
|
}
|