From 2d036f4d95ef3edb7d0b6b5f81357dc66fc12a18 Mon Sep 17 00:00:00 2001 From: oneao Date: Fri, 15 Aug 2025 22:26:59 +0800 Subject: [PATCH] u --- .../go-project/base-farmework/cmd/app/main.go | 4 +- .../configs/app/application.yaml | 2 +- .../base-farmework/logs/error-2025-08-15.log | 15 +++++ .../base-farmework/logs/info-2025-08-15.log | 32 +++++++++++ .../go-project/base-farmework/pkg/logx/log.go | 55 ++++++++++++++++--- .../base-farmework/pkg/reponse/response.go | 1 + .../pkg/utils/{snowflake => uid}/snowflake.go | 2 +- 7 files changed, 98 insertions(+), 13 deletions(-) rename code/go-project/base-farmework/pkg/utils/{snowflake => uid}/snowflake.go (99%) diff --git a/code/go-project/base-farmework/cmd/app/main.go b/code/go-project/base-farmework/cmd/app/main.go index 6965727f..2442190f 100644 --- a/code/go-project/base-farmework/cmd/app/main.go +++ b/code/go-project/base-farmework/cmd/app/main.go @@ -4,7 +4,7 @@ import ( "base-framework/internal/app" "base-framework/pkg/config" "base-framework/pkg/logx" - "base-framework/pkg/utils/snowflake" + "base-framework/pkg/utils/uid" "log" "net/http" "strconv" @@ -23,7 +23,7 @@ func main() { } // 初始化日志 logx.InitLogger() - logx.Logger.Info("项目启动成功...", logx.Uint64("id", snowflake.NextID())) + logx.Logger.Info("项目启动成功...", logx.Uint64("id", uid.NextID())) logx.Logger.Info("项目启动成功2...") logx.Logger.Error("测试错误") diff --git a/code/go-project/base-farmework/configs/app/application.yaml b/code/go-project/base-farmework/configs/app/application.yaml index 91710029..91100248 100644 --- a/code/go-project/base-farmework/configs/app/application.yaml +++ b/code/go-project/base-farmework/configs/app/application.yaml @@ -8,7 +8,7 @@ jwt: log: dir: "logs" # 日志根目录 level: "debug" # 全局最低日志级别 - format: "console" # 输出格式,可选 json 或 console + format: "json" # 输出格式,可选 json 或 console daily: true # 是否按天滚动 maxDays: 30 # 保留天数,0表示无限 caller: true # 是否记录调用文件行号 diff --git a/code/go-project/base-farmework/logs/error-2025-08-15.log b/code/go-project/base-farmework/logs/error-2025-08-15.log index 0172c475..94873437 100644 --- a/code/go-project/base-farmework/logs/error-2025-08-15.log +++ b/code/go-project/base-farmework/logs/error-2025-08-15.log @@ -38,3 +38,18 @@ ERROR app/main.go:29 测试错误... 2025-08-15 17:30:34.451 ERROR 6412 --- app/main.go:29 测试错误 2025-08-15 17:30:45.526 ERROR 216 --- app/main.go:29 测试错误 2025-08-15 17:30:58.865 ERROR 14788 --- app/main.go:29 测试错误 +2025-08-15 20:20:43.212 ERROR 36240 --- app/main.go:29 测试错误 +2025-08-15 20:22:59.824 ERROR 20504 --- app/main.go:29 测试错误 +2025-08-15 20:23:20.618 ERROR 26140 --- app/main.go:29 测试错误 +2025-08-15 20:23:40 ERROR 10016 --- app/main.go:29 测试错误 +2025-08-15 20:27:44.044 ERROR 29060 --- app/main.go:29: 测试错误 +2025-08-15 20:30:58.422 ERROR ...- app/main.go:29: 测试错误 +2025-08-15 20:31:14.222 ERROR 15492 --- app/main.go:29: 测试错误 +2025-08-15 20:31:31.003 ERROR 34092 --- app/main.go:29 测试错误 +2025-08-15 20:31:48.042 ERROR 24436 --- app/main.go:29 测试错误 +2025-08-15 20:32:05.156 ERROR 36992---app/main.go:29 测试错误 +2025-08-15 20:32:13.911 ERROR 860 - app/main.go:29 测试错误 +2025-08-15 20:32:32.059 ERROR [16248] - app/main.go:29 测试错误 +2025-08-15 20:32:41.937 ERROR [12140] app/main.go:29 测试错误 +2025-08-15 22:25:29.409 ERROR [23208] app/main.go:29 测试错误 {"log_id": 347022995107086338} +2025-08-15 22:25:47.684 ERROR [23380] app/main.go:29 测试错误 {"log_id": 347023071757991941} diff --git a/code/go-project/base-farmework/logs/info-2025-08-15.log b/code/go-project/base-farmework/logs/info-2025-08-15.log index 7bd1baaa..fcee9292 100644 --- a/code/go-project/base-farmework/logs/info-2025-08-15.log +++ b/code/go-project/base-farmework/logs/info-2025-08-15.log @@ -78,3 +78,35 @@ INFO app/main.go:27 项目启动成功2... 2025-08-15 17:30:45.526 INFO 216 --- app/main.go:27 项目启动成功2... 2025-08-15 17:30:58.865 INFO 14788 --- app/main.go:26 项目启动成功... {"id": 346948879473704960} 2025-08-15 17:30:58.865 INFO 14788 --- app/main.go:27 项目启动成功2... +2025-08-15 20:20:43.212 INFO 36240 --- app/main.go:26 项目启动成功... {"id": 346991595721064448} +2025-08-15 20:20:43.212 INFO 36240 --- app/main.go:27 项目启动成功2... +2025-08-15 20:22:59.824 INFO 20504 --- app/main.go:26 项目启动成功... {"id": 346992168713322496} +2025-08-15 20:22:59.824 INFO 20504 --- app/main.go:27 项目启动成功2... +2025-08-15 20:23:20.618 INFO 26140 --- app/main.go:26 项目启动成功... {"id": 346992255929679872} +2025-08-15 20:23:20.618 INFO 26140 --- app/main.go:27 项目启动成功2... +2025-08-15 20:23:40 INFO 10016 --- app/main.go:26 项目启动成功... {"id": 346992341233434624} +2025-08-15 20:23:40 INFO 10016 --- app/main.go:27 项目启动成功2... +2025-08-15 20:27:44.044 INFO 29060 --- app/main.go:26: 项目启动成功... {"id": 346993360818405376} +2025-08-15 20:27:44.044 INFO 29060 --- app/main.go:27: 项目启动成功2... +2025-08-15 20:30:58.422 INFO ...- app/main.go:26: 项目启动成功... {"id": 346994176098828288} +2025-08-15 20:30:58.422 INFO ...- app/main.go:27: 项目启动成功2... +2025-08-15 20:31:14.222 INFO 15492 --- app/main.go:26: 项目启动成功... {"id": 346994242368831488} +2025-08-15 20:31:14.222 INFO 15492 --- app/main.go:27: 项目启动成功2... +2025-08-15 20:31:31.003 INFO 34092 --- app/main.go:26 项目启动成功... {"id": 346994312753446912} +2025-08-15 20:31:31.003 INFO 34092 --- app/main.go:27 项目启动成功2... +2025-08-15 20:31:48.042 INFO 24436 --- app/main.go:26 项目启动成功... {"id": 346994384220192768} +2025-08-15 20:31:48.042 INFO 24436 --- app/main.go:27 项目启动成功2... +2025-08-15 20:32:05.156 INFO 36992---app/main.go:26 项目启动成功... {"id": 346994456001511424} +2025-08-15 20:32:05.156 INFO 36992---app/main.go:27 项目启动成功2... +2025-08-15 20:32:13.911 INFO 860 - app/main.go:26 项目启动成功... {"id": 346994492722642944} +2025-08-15 20:32:13.911 INFO 860 - app/main.go:27 项目启动成功2... +2025-08-15 20:32:32.059 INFO [16248] - app/main.go:26 项目启动成功... {"id": 346994568840871936} +2025-08-15 20:32:32.059 INFO [16248] - app/main.go:27 项目启动成功2... +2025-08-15 20:32:41.937 INFO [12140] app/main.go:26 项目启动成功... {"id": 346994610272206848} +2025-08-15 20:32:41.937 INFO [12140] app/main.go:27 项目启动成功2... +2025-08-15 22:25:29.408 INFO [23208] app/main.go:26 项目启动成功... {"id": 347022995102892032} +2025-08-15 22:25:29.409 INFO [23208] app/main.go:27 项目启动成功2... {"log_id": 347022995107086336} +2025-08-15 22:25:47.684 INFO [23380] app/main.go:26 项目启动成功... {"id": 347023071757991936, "log_id": 347023071757991937} +2025-08-15 22:25:47.684 INFO [23380] app/main.go:27 项目启动成功2... {"log_id": 347023071757991939} +{"level":"INFO","ts":"2025-08-15 22:26:12.846","caller":"app/main.go:26","msg":"项目启动成功...","id":347023177295069184,"log_id":347023177295069185} +{"level":"INFO","ts":"2025-08-15 22:26:12.846","caller":"app/main.go:27","msg":"项目启动成功2...","log_id":347023177295069187} diff --git a/code/go-project/base-farmework/pkg/logx/log.go b/code/go-project/base-farmework/pkg/logx/log.go index 02a99c0c..c93984c3 100644 --- a/code/go-project/base-farmework/pkg/logx/log.go +++ b/code/go-project/base-farmework/pkg/logx/log.go @@ -1,6 +1,7 @@ package logx import ( + "base-framework/pkg/utils/uid" "fmt" "os" "path/filepath" @@ -14,6 +15,7 @@ import ( "go.uber.org/zap/zapcore" ) +// ----------------- 全局变量 ----------------- var ( Logger *zap.Logger @@ -30,6 +32,7 @@ var ( errorCore zapcore.Core ) +const LogID = "log_id" const logTmFmtWithMS = "2006-01-02 15:04:05.000" // 彩色日志级别 @@ -43,7 +46,38 @@ var levelColor = map[zapcore.Level]string{ zapcore.FatalLevel: "\033[35mFATAL\033[0m", } -// defaultLogConfig 返回默认日志配置 +// ----------------- trackCore ----------------- +// trackCore 包装 zapcore.Core,实现自动生成 track_id +type trackCore struct { + zapcore.Core +} + +func (c *trackCore) With(fields []zapcore.Field) zapcore.Core { + return &trackCore{Core: c.Core.With(fields)} +} + +func (c *trackCore) Check(entry zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { + if c.Enabled(entry.Level) { + return ce.AddCore(entry, c) + } + return ce +} + +func (c *trackCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { + hasTrackID := false + for _, f := range fields { + if f.Key == LogID { + hasTrackID = true + break + } + } + if !hasTrackID { + fields = append(fields, Uint64(LogID, uid.NextID())) + } + return c.Core.Write(entry, fields) +} + +// ----------------- 默认日志配置 ----------------- func defaultLogConfig() *types.Log { return &types.Log{ Dir: "logs", @@ -57,7 +91,7 @@ func defaultLogConfig() *types.Log { } } -// InitLogger 初始化全局 Logger +// ----------------- 初始化 ----------------- func InitLogger() { once.Do(func() { if config.Log == nil { @@ -68,7 +102,6 @@ func InitLogger() { }) } -// 切换日志文件 func switchDate(today string) { currentDate = today @@ -120,14 +153,18 @@ func switchDate(today string) { return lvl >= zapcore.ErrorLevel })) - cores := []zapcore.Core{infoCore, warnCore, errorCore} + cores := []zapcore.Core{ + &trackCore{infoCore}, + &trackCore{warnCore}, + &trackCore{errorCore}, + } - // 开启本地console输出 + // 开启 console 输出 if config.Log.Console { consoleCore := zapcore.NewCore(newConsoleEncoder(true), zapcore.AddSync(os.Stdout), zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.DebugLevel })) - cores = append(cores, consoleCore) + cores = append(cores, &trackCore{consoleCore}) } Logger = zap.New(zapcore.NewTee(cores...)) @@ -145,6 +182,7 @@ func switchDate(today string) { })) } +// ----------------- 编码器 ----------------- func newConsoleEncoder(enableColor bool) zapcore.Encoder { cfg := zapcore.EncoderConfig{ TimeKey: "ts", @@ -166,13 +204,11 @@ func newConsoleEncoder(enableColor bool) zapcore.Encoder { enc.AppendString(lvl.CapitalString()) } }, - //ConsoleSeparator: "", EncodeCaller: func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) { pid := os.Getpid() - enc.AppendString(fmt.Sprintf("%d --- %s", pid, caller.TrimmedPath())) + enc.AppendString(fmt.Sprintf("[%d] %s", pid, caller.TrimmedPath())) }, } - return zapcore.NewConsoleEncoder(cfg) } @@ -187,6 +223,7 @@ func newJSONEncoder() zapcore.Encoder { return zapcore.NewJSONEncoder(cfg) } +// ----------------- 工具函数 ----------------- func checkDateSwitch() { today := time.Now().Format("2006-01-02") if today != currentDate { diff --git a/code/go-project/base-farmework/pkg/reponse/response.go b/code/go-project/base-farmework/pkg/reponse/response.go index 72a8572f..43aeb559 100644 --- a/code/go-project/base-farmework/pkg/reponse/response.go +++ b/code/go-project/base-farmework/pkg/reponse/response.go @@ -6,6 +6,7 @@ import ( ) type ErrorInfo struct { + Id string `json:"id,omitempty"` Method string `json:"method,omitempty"` Path string `json:"path,omitempty"` Message string `json:"message,omitempty"` diff --git a/code/go-project/base-farmework/pkg/utils/snowflake/snowflake.go b/code/go-project/base-farmework/pkg/utils/uid/snowflake.go similarity index 99% rename from code/go-project/base-farmework/pkg/utils/snowflake/snowflake.go rename to code/go-project/base-farmework/pkg/utils/uid/snowflake.go index 42bc91ff..2fa86d53 100644 --- a/code/go-project/base-farmework/pkg/utils/snowflake/snowflake.go +++ b/code/go-project/base-farmework/pkg/utils/uid/snowflake.go @@ -1,4 +1,4 @@ -package snowflake +package uid import ( "base-framework/pkg/config"