JSON
{
"event_id": "abc123",
"timestamp": "2024-07-12T14:30:00Z",
"event_type": "login_attempt",
"user_id": "anna456",
"result": "success",
"details": {
"ip_address": "203.0.113.5",
"location": "Paris, France",
"device": "iPhone 12",
"os": "iOS 17"
}
},
{
"event_id": "def456",
"timestamp": "2024-07-12T14:35:00Z",
"event_type": "claim_submission",
"user_id": "anna456",
"result": "success",
"details": {
"claim_id": "claim789",
"reason": "Flight Cancellation",
"document_uploaded": "flight_cancellation.pdf",
"claim_amount": 500.00,
"status": "submitted"
}
},
{
"event_id": "ghi789",
"timestamp": "2024-07-12T14:45:00Z",
"event_type": "claim_approval",
"user_id": "anna456",
"result": "approved",
"details": {
"claim_id": "claim789",
"approval_amount": 500.00,
"payout_method": "Digital Wallet",
"payout_status": "completed"
}
}
timestamp, event_id, event_type, user_id, result.route — маршрут, в котором отражены задействованные микросервисы.timestamp, event_id, user_id, event_type, которые предоставляют всю необходимую информацию в удобном формате.JSON
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time"
},
"event_id": {
"type": "string"
},
"user_id": {
"type": "string"
},
"event_type": {
"type": "string",
"enum": ["registration", "login", "data_access", "payment", "admin_action"]
},
"result": {
"type": "string",
"enum": ["success", "failed", "rejection"]
},
"details": {
"type": "object",
"additionalProperties": true
}
},
"required": ["timestamp", "event_id", "user_id", "event_type", "result", "details"]
} GO
package main
import (
"encoding/json"
"log"
"time"
)
type LogEntry struct {
Timestamp string `json:"timestamp"`
EventID string `json:"event_id"`
UserID string `json:"user_id"`
EventType string `json:"event_type"`
Result string `json:"result"`
Details struct {
IPAddress string `json:"ip_address"`
Location string `json:"location"`
Device string `json:"device"`
OS string `json:"os"`
} `json:"details"`
}
// logUserRegistration пример кода для записи лога
func logUserRegistration(userID string, result string) {
entry := LogEntry{
Timestamp: time.Now().Format(time.RFC3339),
EventID: "evt_001",
UserID: userID,
EventType: "registration",
Result: result,
Details: struct {
IPAddress string `json:"ip_address"`
Location string `json:"location"`
Device string `json:"device"`
OS string `json:"os"`
}{
IPAddress: "127.0.0.1",
Location: "Moscow, Russia",
Device: "Some-Phone",
OS: "iOS XX",
},
}
logJSON, err := json.Marshal(entry)
if err != nil {
log.Printf("Error marshaling log entry: %v", err)
return
}
log.Println(string(logJSON))
}
func main() {
logUserRegistration("user123", "success")
} GO
package main
import (
"encoding/json"
"log"
"time"
)
type PaymentLogEntry struct {
Timestamp string `json:"timestamp"`
EventID string `json:"event_id"`
TransactionID string `json:"transaction_id"`
UserID string `json:"user_id"`
EventType string `json:"event_type"`
Result string `json:"result"`
Details struct {
Amount int `json:"amount"`
Currency string `json:"currency"`
Reason string `json:"reason"`
PaymentMethod string `json:"payment_method"`
} `json:"details"`
}
type PaymentFailureDTO struct {
TransactionID string
UserID string
Reason string
Amount int
Currency string
PaymentMethod string
EventID string
}
func logPaymentFailure(dto PaymentFailureDTO) {
entry := PaymentLogEntry{
Timestamp: time.Now().Format(time.RFC3339),
EventID: dto.EventID,
TransactionID: dto.TransactionID,
UserID: dto.UserID,
EventType: "payment",
Result: "failed",
}
entry.Details.Amount = dto.Amount
entry.Details.Currency = dto.Currency
entry.Details.Reason = dto.Reason
entry.Details.PaymentMethod = dto.PaymentMethod
logJSON, err := json.Marshal(entry)
if err != nil {
log.Printf("Error marshaling JSON: %v", err)
return
}
log.Println(string(logJSON))
}
func main() {
dto := PaymentFailureDTO{
TransactionID: "trans_12345",
UserID: "user_67890",
Reason: "Insufficient funds",
Amount: 5000,
Currency: "RUB",
PaymentMethod: "credit_card",
EventID: "evt_002",
}
logPaymentFailure(dto)
} GO
package main
import (
"bufio"
"encoding/json"
"fmt"
"log"
"os"
"sync"
)
// LogEntry представляет общую структуру записи лога.
type LogEntry struct {
EventID string `json:"event_id"`
Timestamp string `json:"timestamp"`
EventType string `json:"event_type"`
UserID string `json:"user_id"`
Result string `json:"result"`
Details map[string]interface{} `json:"details"`
}
// ErrorHandler — это интерфейс для обработки ошибок.
type ErrorHandler interface {
HandleError(entry LogEntry)
}
// LogErrorHandler записывает ошибку в лог.
type LogErrorHandler struct{}
func (h *LogErrorHandler) HandleError(entry LogEntry) {
log.Printf("Обнаружена ошибка: %s, Пользователь: %s, Время: %s\n",
entry.EventType, entry.UserID, entry.Timestamp)
}
// NotifyUserHandler отправляет уведомление пользователю.
type NotifyUserHandler struct{}
func (h *NotifyUserHandler) HandleError(entry LogEntry) {
// Реализация отправки уведомления пользователю
}
// BlockUserHandler временно блокирует пользователя.
type BlockUserHandler struct{}
func (h *BlockUserHandler) HandleError(entry LogEntry) {
// Реализация блокировки пользователя
}
// CreateIncidentHandler создаёт инцидент для службы ИБ.
type CreateIncidentHandler struct{}
func (h *CreateIncidentHandler) HandleError(entry LogEntry) {
// Реализация создания инцидента для службы ИБ
}
func analyzeLogs(handlers []ErrorHandler) error {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
var entry LogEntry
line := scanner.Text()
err := json.Unmarshal([]byte(line), &entry)
if err != nil {
return fmt.Errorf("ошибка декодирования: %w", err)
}
if entry.Result != "success" {
var wg sync.WaitGroup
for _, handler := range handlers {
wg.Add(1)
go func(h ErrorHandler, e LogEntry) {
defer wg.Done()
h.HandleError(e)
}(handler, entry)
}
wg.Wait()
}
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("ошибка чтения данных: %w", err)
}
return nil
}
func main() {
handlers := []ErrorHandler{
&LogErrorHandler{},
&NotifyUserHandler{},
&BlockUserHandler{},
&CreateIncidentHandler{},
}
if err := analyzeLogs(handlers); err != nil {
log.Fatalf("Произошла ошибка: %v", err)
}
}