2025-05-17 11:36:26 -04:00

76 lines
2.0 KiB
Go

package logging
import (
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"sync"
"time"
"gopkg.in/natefinch/lumberjack.v2"
)
// LogConfig contiene la configuración para el sistema de logging
type LogConfig struct {
BaseDir string
BaseFilename string
MaxSize int // MB
MaxBackups int
MaxAge int // days
Compress bool
}
// LoggerSystem es el sistema de logs centralizado
type LoggerSystem struct {
Info *log.Logger
Error *log.Logger
Debug *log.Logger
writer *lumberjack.Logger
mu sync.Mutex
config *LogConfig
}
// NewLoggerSystem crea una nueva instancia del sistema de logs
func NewLoggerSystem(config *LogConfig) (*LoggerSystem, error) {
// Asegurar que el directorio existe
if err := os.MkdirAll(config.BaseDir, 0755); err != nil {
return nil, fmt.Errorf("error creando directorio de logs: %w", err)
}
// Crear nombre de archivo con timestamp
timestamp := time.Now().Format("20060102_150405")
ext := filepath.Ext(config.BaseFilename)
baseName := strings.TrimSuffix(config.BaseFilename, ext)
currentLogFile := filepath.Join(config.BaseDir, fmt.Sprintf("%s_%s%s", baseName, timestamp, ext))
// Configurar la rotación de logs con lumberjack
logWriter := &lumberjack.Logger{
Filename: currentLogFile,
MaxSize: config.MaxSize,
MaxBackups: config.MaxBackups,
MaxAge: config.MaxAge,
Compress: config.Compress,
LocalTime: true,
}
// Usar un writer multi para enviar logs tanto a stdout como al archivo
multiWriter := io.MultiWriter(os.Stdout, logWriter)
return &LoggerSystem{
Info: log.New(multiWriter, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile),
Error: log.New(multiWriter, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile),
Debug: log.New(multiWriter, "DEBUG: ", log.Ldate|log.Ltime|log.Lshortfile),
writer: logWriter,
config: config,
}, nil
}
// Close cierra el sistema de logs
func (ls *LoggerSystem) Close() error {
// No necesitamos cerrar explícitamente porque lumberjack se encarga de eso
return nil
}