Event logging
This commit is contained in:
102
internal/eventlogger/eventlogger.go
Normal file
102
internal/eventlogger/eventlogger.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package eventlogger
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"git.warky.dev/wdevs/whatshooked/internal/config"
|
||||
"git.warky.dev/wdevs/whatshooked/internal/events"
|
||||
"git.warky.dev/wdevs/whatshooked/internal/logging"
|
||||
)
|
||||
|
||||
// Logger handles event logging to multiple targets
|
||||
type Logger struct {
|
||||
config config.EventLoggerConfig
|
||||
dbConfig config.DatabaseConfig
|
||||
targets []Target
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
// Target represents a logging target
|
||||
type Target interface {
|
||||
Log(event events.Event) error
|
||||
Close() error
|
||||
}
|
||||
|
||||
// NewLogger creates a new event logger
|
||||
func NewLogger(cfg config.EventLoggerConfig, dbConfig config.DatabaseConfig) (*Logger, error) {
|
||||
logger := &Logger{
|
||||
config: cfg,
|
||||
dbConfig: dbConfig,
|
||||
targets: make([]Target, 0),
|
||||
}
|
||||
|
||||
// Initialize targets based on configuration
|
||||
for _, targetType := range cfg.Targets {
|
||||
switch strings.ToLower(targetType) {
|
||||
case "file":
|
||||
fileTarget, err := NewFileTarget(cfg.FileDir)
|
||||
if err != nil {
|
||||
logging.Error("Failed to initialize file target", "error", err)
|
||||
continue
|
||||
}
|
||||
logger.targets = append(logger.targets, fileTarget)
|
||||
logging.Info("Event logger file target initialized", "dir", cfg.FileDir)
|
||||
|
||||
case "sqlite":
|
||||
sqliteTarget, err := NewSQLiteTarget(dbConfig, cfg.TableName)
|
||||
if err != nil {
|
||||
logging.Error("Failed to initialize SQLite target", "error", err)
|
||||
continue
|
||||
}
|
||||
logger.targets = append(logger.targets, sqliteTarget)
|
||||
logging.Info("Event logger SQLite target initialized")
|
||||
|
||||
case "postgres", "postgresql":
|
||||
postgresTarget, err := NewPostgresTarget(dbConfig, cfg.TableName)
|
||||
if err != nil {
|
||||
logging.Error("Failed to initialize PostgreSQL target", "error", err)
|
||||
continue
|
||||
}
|
||||
logger.targets = append(logger.targets, postgresTarget)
|
||||
logging.Info("Event logger PostgreSQL target initialized")
|
||||
|
||||
default:
|
||||
logging.Error("Unknown event logger target type", "type", targetType)
|
||||
}
|
||||
}
|
||||
|
||||
return logger, nil
|
||||
}
|
||||
|
||||
// Log logs an event to all configured targets
|
||||
func (l *Logger) Log(event events.Event) {
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
|
||||
for _, target := range l.targets {
|
||||
if err := target.Log(event); err != nil {
|
||||
logging.Error("Failed to log event", "target", fmt.Sprintf("%T", target), "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Close closes all logging targets
|
||||
func (l *Logger) Close() error {
|
||||
l.mu.Lock()
|
||||
defer l.mu.Unlock()
|
||||
|
||||
var errors []string
|
||||
for _, target := range l.targets {
|
||||
if err := target.Close(); err != nil {
|
||||
errors = append(errors, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
if len(errors) > 0 {
|
||||
return fmt.Errorf("errors closing targets: %s", strings.Join(errors, "; "))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user