Files
2026-07-22 17:50:33 +08:00

77 lines
1.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}