chore: initial commit

This commit is contained in:
2026-07-22 17:50:33 +08:00
parent 82936a8987
commit ee9f50b859
107 changed files with 8346 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
package logger
import (
"io"
"log/slog"
"os"
"strings"
"server/internal/config"
"gopkg.in/natefinch/lumberjack.v2"
)
// New 根据配置创建 slog.Logger并将其设置为默认 logger。
// 日志会写入文件(自动按大小/时间滚动),并可选同时输出到控制台。
func New(cfg *config.Config) *slog.Logger {
logCfg := cfg.Log
// 文件滚动写入
fileWriter := &lumberjack.Logger{
Filename: defaultStr(logCfg.Filename, "logs/app.log"),
MaxSize: defaultInt(logCfg.MaxSize, 100), // MB
MaxBackups: defaultInt(logCfg.MaxBackups, 30),
MaxAge: defaultInt(logCfg.MaxAge, 30), // days
Compress: logCfg.Compress,
}
var writer io.Writer = fileWriter
if logCfg.Console {
writer = io.MultiWriter(os.Stdout, fileWriter)
}
opts := &slog.HandlerOptions{
Level: parseLevel(logCfg.Level),
AddSource: false,
}
// 生产环境用 JSON便于日志采集/检索;开发环境用文本更易读
var handler slog.Handler
if config.IsDev() {
handler = slog.NewTextHandler(writer, opts)
} else {
handler = slog.NewJSONHandler(writer, opts)
}
l := slog.New(handler)
slog.SetDefault(l) // 让全局 slog.Info/Error 也走同一套配置
return l
}
func parseLevel(level string) slog.Level {
switch strings.ToLower(level) {
case "debug":
return slog.LevelDebug
case "warn", "warning":
return slog.LevelWarn
case "error":
return slog.LevelError
default:
return slog.LevelInfo
}
}
func defaultStr(v, def string) string {
if v == "" {
return def
}
return v
}
func defaultInt(v, def int) int {
if v <= 0 {
return def
}
return v
}