Files
server_torii/internal/utils/logx.go
2025-04-28 22:08:28 -04:00

137 lines
3.2 KiB
Go

package utils
import (
"fmt"
"log"
"os"
"path/filepath"
"server_torii/internal/dataType"
"sync"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type LogxManager struct {
basePath string
loggers map[string]*zap.Logger
mu sync.RWMutex
}
var logger *LogxManager
func InitLogx(base string) {
logger = newManager(base)
}
func newManager(base string) *LogxManager {
m := &LogxManager{basePath: base, loggers: make(map[string]*zap.Logger)}
if err := os.MkdirAll(m.basePath, 0744); err != nil {
log.Printf("failed to create base log dir %s: %v", m.basePath, err)
}
return m
}
func (m *LogxManager) getLogger(host string) *zap.Logger {
m.mu.RLock()
if lg, ok := m.loggers[host]; ok {
m.mu.RUnlock()
return lg
}
m.mu.RUnlock()
m.mu.Lock()
defer m.mu.Unlock()
dir := filepath.Join(m.basePath, host)
if err := os.MkdirAll(dir, 0744); err != nil {
log.Printf("failed to create log dir %s: %v", dir, err)
}
encCfg := zapcore.EncoderConfig{MessageKey: "msg", LineEnding: zapcore.DefaultLineEnding}
encoder := zapcore.NewConsoleEncoder(encCfg)
infoOut := zapcore.AddSync(m.openLogFile(filepath.Join(dir, "info.log")))
errorOut := zapcore.AddSync(m.openLogFile(filepath.Join(dir, "error.log")))
dbgOut := zapcore.AddSync(m.openLogFile(filepath.Join(dir, "debug.log")))
infoLv := zap.LevelEnablerFunc(func(l zapcore.Level) bool { return l == zapcore.InfoLevel })
errLv := zap.LevelEnablerFunc(func(l zapcore.Level) bool { return l >= zapcore.ErrorLevel })
dbgLv := zap.LevelEnablerFunc(func(l zapcore.Level) bool { return l == zapcore.DebugLevel })
tee := zapcore.NewTee(
zapcore.NewCore(encoder, infoOut, infoLv),
zapcore.NewCore(encoder, errorOut, errLv),
zapcore.NewCore(encoder, dbgOut, dbgLv),
)
lg := zap.New(tee)
m.loggers[host] = lg
return lg
}
func (m *LogxManager) openLogFile(path string) *os.File {
f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Printf("failed to open log file %s: %v", path, err)
return os.Stdout
}
return f
}
func LogInfo(reqData dataType.UserRequest, msg, msg2 string) {
m := logger
if m == nil {
log.Printf("LogxManager is not initialized")
return
}
lg := m.getLogger(reqData.Host)
line := fmt.Sprintf("%s - - [%s] %s %s %s %s %s",
reqData.RemoteIP,
time.Now().Format("02/Jan/2006:15:04:05 -0700"),
msg,
reqData.Host,
reqData.Uri,
reqData.UserAgent,
msg2,
)
lg.Info(line)
}
func LogError(reqData dataType.UserRequest, msg, msg2 string) {
m := logger
if m == nil {
log.Printf("LogxManager is not initialized")
return
}
lg := m.getLogger(reqData.Host)
line := fmt.Sprintf("%s - - [%s] %s %s %s %s %s",
reqData.RemoteIP,
time.Now().Format("02/Jan/2006:15:04:05 -0700"),
msg,
reqData.Host,
reqData.Uri,
reqData.UserAgent,
msg2,
)
lg.Error(line)
}
func LogDebug(reqData dataType.UserRequest, msg, msg2 string) {
m := logger
if m == nil {
log.Printf("LogxManager is not initialized")
return
}
lg := m.getLogger(reqData.Host)
line := fmt.Sprintf("%s - - [%s] %s %s %s %s %s",
reqData.RemoteIP,
time.Now().Format("02/Jan/2006:15:04:05 -0700"),
msg,
reqData.Host,
reqData.Uri,
reqData.UserAgent,
msg2,
)
lg.Debug(line)
}