91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var logPattern = regexp.MustCompile(`(?P<timestamp>[\d-]+T[\d:]+\.\d+Z).*(?P<action>sent-message:.*)\s+(?P<logData>{.*})`)
|
||
|
|
||
|
func main() {
|
||
|
if len(os.Args) != 2 {
|
||
|
fmt.Println("Usage: go run script.go <filename>")
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
filename := os.Args[1]
|
||
|
file, err := os.Open(filename)
|
||
|
if err != nil {
|
||
|
fmt.Printf("Error opening file: %s\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
scanner := bufio.NewScanner(file)
|
||
|
|
||
|
fmt.Printf("Timestamp\tMessageType\tContentType\tMessageID\tHashes\tRecipients\n")
|
||
|
for scanner.Scan() {
|
||
|
line := scanner.Text()
|
||
|
|
||
|
// Check if the line contains "sent-message"
|
||
|
if strings.Contains(line, "sent-message") {
|
||
|
match := logPattern.FindStringSubmatch(line)
|
||
|
|
||
|
// Ensure the match is not nil and has expected groups
|
||
|
if match != nil && len(match) > 3 {
|
||
|
logTime, _ := time.Parse(time.RFC3339Nano, matchMap("timestamp", match))
|
||
|
logData := matchMap("logData", match)
|
||
|
|
||
|
var data map[string]interface{}
|
||
|
if err := json.Unmarshal([]byte(logData), &data); err == nil {
|
||
|
recipients := arrayToString(data["recipient"])
|
||
|
messageID := fmt.Sprintf("%v", data["messageID"])
|
||
|
messageType := fmt.Sprintf("%v", data["messageType"])
|
||
|
contentType := fmt.Sprintf("%v", data["contentType"])
|
||
|
hashes := arrayToString(data["hashes"])
|
||
|
|
||
|
// Print the required information
|
||
|
fmt.Printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",
|
||
|
logTime.Format(time.RFC3339Nano), messageType, contentType, messageID, hashes, recipients)
|
||
|
}
|
||
|
} else {
|
||
|
fmt.Printf("Warning: Line does not match expected format: %s\n", line)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if err := scanner.Err(); err != nil {
|
||
|
fmt.Printf("Error reading file: %s\n", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Helper function to convert an array to a string
|
||
|
func arrayToString(arr interface{}) string {
|
||
|
if arr != nil {
|
||
|
switch v := arr.(type) {
|
||
|
case []interface{}:
|
||
|
var result []string
|
||
|
for _, item := range v {
|
||
|
result = append(result, fmt.Sprintf("%v", item))
|
||
|
}
|
||
|
return strings.Join(result, ", ")
|
||
|
}
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
// Helper function to get the value of a named capture group from regex match
|
||
|
func matchMap(key string, matches []string) string {
|
||
|
for i, name := range logPattern.SubexpNames() {
|
||
|
if name == key {
|
||
|
return matches[i]
|
||
|
}
|
||
|
}
|
||
|
return ""
|
||
|
}
|