package logger import ( "encoding/json" "fmt" "os" "sync" "time" ) type EventLogger struct { file *os.File humanFile *os.File mu sync.Mutex } func NewEventLogger() (*EventLogger, error) { // Получаем пути к файлам jsonPath, err := GetEventLogPath() if err != nil { return nil, fmt.Errorf("ошибка получения пути для JSON логов: %w", err) } humanPath, err := GetEventHumanLogPath() if err != nil { return nil, fmt.Errorf("ошибка получения пути для Human логов: %w", err) } // Открываем JSON файл f, err := os.OpenFile(jsonPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return nil, fmt.Errorf("ошибка открытия JSON лога: %w", err) } // Открываем Human-readable файл humanF, err := os.OpenFile(humanPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { f.Close() return nil, fmt.Errorf("ошибка открытия Human лога: %w", err) } return &EventLogger{ file: f, humanFile: humanF, }, nil } func (l *EventLogger) Event(name string) { l.mu.Lock() defer l.mu.Unlock() now := time.Now() // JSON формат (для машин) ev := struct { Timestamp int64 `json:"ts"` Time string `json:"time"` Event string `json:"event"` }{ Timestamp: now.Unix(), Time: now.Format("2006-01-02 15:04:05"), Event: name, } data, _ := json.Marshal(ev) data = append(data, '\n') l.file.Write(data) // Human-readable формат humanLine := fmt.Sprintf("[%s] EVENT: %s\n", now.Format("2006-01-02 15:04:05.000"), name) l.humanFile.WriteString(humanLine) l.file.Sync() l.humanFile.Sync() } func (l *EventLogger) Close() error { l.file.Close() l.humanFile.Close() return nil }