Прежде чем анализировать логи, нужно договориться, как представлять каждую запись в программе. Каждая строка лога — это цифровой отпечаток события: когда произошло, в каком сервисе, что именно случилось, и как связать это событие с другими.
На этом этапе мы создадим структуру данных для хранения записи и функцию для её парсинга из текстовой строки.
— инструмент для поиска текста по шаблону. Вы не знаете точное значение request_id, но знаете, что оно всегда начинается с request_id=. Регулярное выражение описывает шаблон того, как выглядит искомый текст.
re := regexp.MustCompile(`request_id=([a-zA-Z0-9_]+)`) matches := re.FindStringSubmatch(line) if len(matches) > 1 { requestID := matches[1] // Захваченная группа }
MustCompile компилирует шаблон один раз (паникует при ошибке — используйте только для константных шаблонов). FindStringSubmatch возвращает срез: первый элемент — полное совпадение, последующие — захваченные группы в скобках.
💡 Gotcha: Компилируйте регулярные выражения один раз и переиспользуйте. Компиляция на каждую строку — дорогая операция.
| Пакет | Назначение | Ключевые функции |
|---|---|---|
regexp | Регулярные выражения | MustCompile, FindStringSubmatch |
time | Работа со временем | Parse |
strings | Работа со строками | TrimSpace, Contains |
Создать структуру для хранения записи лога и функцию парсинга.
Что необходимо сделать:
Структура LogEntry:
Timestamp (time.Time) — когда произошло событиеLevel (string) — INFO, WARN, ERRORService (string) — какой сервис создал записьMessage (string) — текст сообщенияRequestID (string) — идентификатор для сопоставленияUserID (string) — идентификатор пользователя (опционально)Функция:
func ParseLogLine(line string) (LogEntry, error)
Логика:
[INFO], [ERROR]request_id с помощью регулярного выражения$ go run main.go Parsing: 2023-12-25T14:30:15.123Z [INFO] user-service: User authenticated, request_id=req_abc123, user_id=12345 LogEntry{ Timestamp: 2023-12-25 14:30:15.123 +0000 UTC Level: INFO Service: user-service Message: User authenticated, request_id=req_abc123, user_id=12345 RequestID: req_abc123 UserID: 12345 }
LogEntry определена с полями Timestamp, Level, Service, Message, RequestID, UserIDParseLogLine(line string) (LogEntry, error) созданаtime.ParseRequestID извлекается с помощью regexp