diff --git a/README.md b/README.md index 33afcc4..9605289 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,8 @@ WantedBy=multi-user.target | 参数 | 是否可选 | 默认值 | 数据类型 | 解释 | | -------- | -------: | :---------------: | -------- | --------------------------------- | | -port | 是 | 8080 | int | 代理服务器监听端口 | -| -debug | 是 | false | bool | 调试模式(debug 级别日志) | +| -debug | 是 | false | bool | 调试模式(等价于未指定 -log-level 时将日志等级提升为 debug) | +| -log-level | 是 | warn | string | 日志等级: debug / info / warn / error | | -log | 是 | (输出到 stderr) | string | 日志文件路径(默认输出到 stderr) | | -grace | 是 | 10 | int | 优雅停机等待秒数 | | -timeout | 是 | 0 | int | 单次上游请求超时秒(0 = 不设置) | diff --git a/internal/config/config.go b/internal/config/config.go index 14b874d..4c590e4 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -12,6 +12,7 @@ type Config struct { LogFile string ShutdownGrace int // 优雅停机等待秒数 RequestTimeout int // 上游整体请求超时时间(秒) + LogLevel string // 日志等级: debug|info|warn|error } // Parse 解析命令行参数返回配置 @@ -22,7 +23,11 @@ func Parse() *Config { flag.StringVar(&cfg.LogFile, "log", "", "日志文件路径 (默认输出到 stderr)") flag.IntVar(&cfg.ShutdownGrace, "grace", 10, "优雅停机等待秒数") flag.IntVar(&cfg.RequestTimeout, "timeout", 0, "单次上游请求超时秒(0=不设置)") + flag.StringVar(&cfg.LogLevel, "log-level", "warn", "日志等级: debug|info|warn|error (默认 warn)") flag.Parse() + + // 兼容旧的 -debug 参数: 当 -debug 为 true 且未显式指定其它日志等级(仍为默认 warn) 时,提升为 debug + if cfg.Debug && cfg.LogLevel == "warn" { cfg.LogLevel = "debug" } return cfg } diff --git a/main.go b/main.go index 972fb54..ff5d63a 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "os/signal" + "strings" "syscall" "time" @@ -22,9 +23,21 @@ import ( func main() { cfg := config.Parse() - // 日志初始化设置 + // 日志初始化设置 (支持显式日志等级) levelVar := new(slog.LevelVar) - if cfg.Debug { levelVar.Set(slog.LevelDebug) } else { levelVar.Set(slog.LevelInfo) } + lvlStr := strings.ToLower(cfg.LogLevel) + switch lvlStr { + case "debug": + levelVar.Set(slog.LevelDebug) + case "info": + levelVar.Set(slog.LevelInfo) + case "warn", "warning": + levelVar.Set(slog.LevelWarn) + case "error", "err": + levelVar.Set(slog.LevelError) + default: + levelVar.Set(slog.LevelWarn) // 回退到默认 warn + } var writer io.Writer = os.Stderr if cfg.LogFile != "" { f, err := os.OpenFile(cfg.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) @@ -35,7 +48,7 @@ func main() { logger := slog.New(h) slog.SetDefault(logger) - if cfg.Debug { gin.SetMode(gin.DebugMode) } else { gin.SetMode(gin.ReleaseMode) } + if cfg.Debug || lvlStr == "debug" { gin.SetMode(gin.DebugMode) } else { gin.SetMode(gin.ReleaseMode) } // 可复用的 HTTP 客户端(保持连接复用) transport := &http.Transport{Proxy: http.ProxyFromEnvironment, DisableCompression: true} @@ -51,7 +64,7 @@ func main() { r.Any("/proxy/*proxyPath", p.HandleProxyPath) // 处理 /proxy/*path 形式的请求 r.Any(":protocol/*remainder", p.HandleProtocol) // 处理 /:protocol/*remainder 形式的请求 - logger.Info("服务器启动", "addr", cfg.Addr(), "debug", cfg.Debug, "version", version.Version, "commit", version.GitCommit) + logger.Info("服务器启动", "addr", cfg.Addr(), "debug", cfg.Debug, "log_level", lvlStr, "version", version.Version, "commit", version.GitCommit) // 优雅停机设置:监听系统信号,执行平滑关闭 srv := &http.Server{Addr: cfg.Addr(), Handler: r}