From 28c0c31ff99d82da0f312e340299cafc6558acf7 Mon Sep 17 00:00:00 2001 From: comma <3191605956@qq.com> Date: Tue, 14 Oct 2025 16:32:03 +0800 Subject: [PATCH] =?UTF-8?q?:new:=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=A1=B9,=E8=B0=83=E6=8E=A7=E5=A0=86?= =?UTF-8?q?=E6=A0=88=E6=89=93=E5=8D=B0=E7=BA=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 52 ++++++++++++++++++++++++--------------------- config.go | 5 +++-- default_logger.yaml | 4 +++- logger.go | 25 ++++++++++++++++++---- option.go | 6 ++++++ 5 files changed, 61 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 15e79ad..b874e11 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ func main() { logger: encoder: "json" # 全局编码器 (json/console) level: "info" # 全局日志级别 + stack_level: "panic" file: enable: true # 启用文件输出,默认关闭 @@ -84,10 +85,11 @@ if err := zap_logger.NewZapLogger("logger.yaml"); err != nil { ## 配置说明 ### 全局配置 (logger) -| 字段名 | 类型 | 说明 | 可选值 | 默认值 | -|----------|--------|-------------------------------|------------------------|-----------| -| encoder | string | 全局日志编码器 | "json", "console" | "console" | -| level | string | 全局日志级别 | "debug", "info", "warn", "error", "dpanic", "panic", "fatal" | "info" | +| 字段名 | 类型 | 说明 | 可选值 | 默认值 | +|-------------|--------|---------|------------------------|-----------| +| encoder | string | 全局日志编码器 | "json", "console" | "console" | +| level | string | 全局日志级别 | "debug", "info", "warn", "error", "dpanic", "panic", "fatal" | "info" | +| stack_level | string | 堆栈打印级别 | "info", "warn", "error", "dpanic", "panic", "fatal" | "panic" | ### 文件输出配置 (file) | 字段名 | 类型 | 说明 | 默认值 | @@ -149,26 +151,27 @@ func main() { 完整选项列表: -| 函数名 | 说明 | 参数类型/示例 | -|----------------------------|-------------------------------|--------------------------------| -| WithEncoder | 设置全局编码器 | JsonEncoder/ConsoleEncoder | -| WithLevel | 设置全局日志级别 | "debug", "info", "warn"等 | -| WithEnableFile | 启用/禁用文件输出 | true/false | -| WithFilename | 设置日志文件名 | "app.log" | -| WithFileMaxSize | 设置文件最大尺寸(MB) | 20 | -| WithFileMaxAge | 设置日志保留天数 | 15 | -| WithFileMaxBackups | 设置最大备份数量 | 10 | -| WithFileLocaltime | 备份文件使用本地时间 | true/false | -| WithFileCompress | 启用/禁用备份压缩 | true/false | -| WithConsoleEnable | 启用/禁用控制台输出 | true/false | -| WithConsoleEnableColor | 启用/禁用控制台彩色输出 | true/false | -| WithLokiEnable | 启用/禁用Loki输出 | true/false | -| WithLokiHost | 设置Loki服务主机 | "loki.example.com" | -| WithLokiPort | 设置Loki服务端口 | 3100 | -| WithLokiSource | 设置日志来源标识 | "payment-service" | -| WithLokiService | 设置服务名称标签 | "api" | -| WithLokiJob | 设置任务名称标签 | "backend" | -| WithLokiEnvironment | 设置环境标识标签 | "production" | +| 函数名 | 说明 | 参数类型/示例 | +|------------------------|-------------|----------------------------------------------------| +| WithEncoder | 设置全局编码器 | JsonEncoder/ConsoleEncoder | +| WithLevel | 设置全局日志级别 | "debug", "info", "warn"等 | +| WithStackLevel | 设置堆栈打印级别 | "debug", "info", "warn", "error", "panic", "fatal" | +| WithEnableFile | 启用/禁用文件输出 | true/false | +| WithFilename | 设置日志文件名 | "app.log" | +| WithFileMaxSize | 设置文件最大尺寸(MB) | 20 | +| WithFileMaxAge | 设置日志保留天数 | 15 | +| WithFileMaxBackups | 设置最大备份数量 | 10 | +| WithFileLocaltime | 备份文件使用本地时间 | true/false | +| WithFileCompress | 启用/禁用备份压缩 | true/false | +| WithConsoleEnable | 启用/禁用控制台输出 | true/false | +| WithConsoleEnableColor | 启用/禁用控制台彩色输出 | true/false | +| WithLokiEnable | 启用/禁用Loki输出 | true/false | +| WithLokiHost | 设置Loki服务主机 | "loki.example.com" | +| WithLokiPort | 设置Loki服务端口 | 3100 | +| WithLokiSource | 设置日志来源标识 | "payment-service" | +| WithLokiService | 设置服务名称标签 | "api" | +| WithLokiJob | 设置任务名称标签 | "backend" | +| WithLokiEnvironment | 设置环境标识标签 | "production" | ## 高级使用示例 @@ -179,6 +182,7 @@ func main() { logger: encoder: "json" level: "info" + stack_level: "panic" file: enable: true diff --git a/config.go b/config.go index 4dcf8af..19d7a5d 100644 --- a/config.go +++ b/config.go @@ -8,8 +8,9 @@ type Config struct { } type Logger struct { - Encoder string `yaml:"encoder"` - Level string `yaml:"level"` + Encoder string `yaml:"encoder"` + Level string `yaml:"level"` + StackLevel string `yaml:"stack_level"` } type File struct { diff --git a/default_logger.yaml b/default_logger.yaml index bd670ad..d298d76 100644 --- a/default_logger.yaml +++ b/default_logger.yaml @@ -1,9 +1,11 @@ # 通用配置 logger: # 编码方式 json 或者 console - encoder: json + encoder: console # 日志级别 level: info + # 堆栈输出级别 + stack_level: panic # 文件形式 file: diff --git a/logger.go b/logger.go index 74414d6..05f8450 100644 --- a/logger.go +++ b/logger.go @@ -3,6 +3,7 @@ package zap_logger import ( "errors" "os" + "strings" _ "embed" @@ -68,11 +69,27 @@ func NewZapLogger(filePath string, opts ...Option) error { cores = append(cores, newConsoleLogger(config.Console).Init()) } + var stackLevel zapcore.Level + switch strings.ToLower(config.Logger.StackLevel) { + case "info": + stackLevel = zap.InfoLevel + case "warn": + stackLevel = zap.WarnLevel + case "error": + stackLevel = zap.ErrorLevel + case "panic": + stackLevel = zap.DPanicLevel + case "fatal": + stackLevel = zap.FatalLevel + default: + stackLevel = zap.DPanicLevel + } + logger := zap.New( - zapcore.NewTee(cores...), // 开启的日志核心 - zap.AddCaller(), // 启用调用者信息 - zap.AddCallerSkip(1), // 调用者信息跳过 - zap.AddStacktrace(zap.ErrorLevel), // 开启panic日志错误堆栈收集 + zapcore.NewTee(cores...), // 开启的日志核心 + zap.AddCaller(), // 启用调用者信息 + zap.AddCallerSkip(1), // 调用者信息跳过 + zap.AddStacktrace(stackLevel), // 开启panic日志错误堆栈收集 ) zap.ReplaceGlobals(logger) return nil diff --git a/option.go b/option.go index e27aaab..26ce08a 100644 --- a/option.go +++ b/option.go @@ -21,6 +21,12 @@ func WithLevel(level string) Option { } } +func WithStackLevel(level string) Option { + return func(conf *Config) { + conf.Logger.StackLevel = level + } +} + func WithEnableFile(enable bool) Option { return func(conf *Config) { conf.File.Enable = enable