Skip to content

Commit 6b44d07

Browse files
committed
feat(log): 改进日志分组功能,支持嵌套分组和分组名称显示
1 parent ffcda49 commit 6b44d07

File tree

2 files changed

+59
-30
lines changed

2 files changed

+59
-30
lines changed

log/example/main.go

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,46 @@ import (
77
)
88

99
func main() {
10-
var loggerA, loggerB log.Logger
10+
// 创建基本的日志记录器
1111
var builder = log.GetBuilder()
12+
baseLogger := builder.Develop()
13+
14+
// 创建命名的日志记录器
15+
userLogger := baseLogger.WithGroup("user")
16+
authLogger := baseLogger.WithGroup("auth")
17+
dbLogger := baseLogger.WithGroup("database")
18+
19+
// 使用命名的日志记录器
20+
userLogger.Info("用户登录成功", "userId", "12345")
21+
authLogger.Warn("检测到可疑的登录尝试", "ip", "192.168.1.100")
22+
dbLogger.Error("数据库连接失败", log.Err(errors.New("connection timeout")))
23+
24+
// 演示嵌套命名
25+
userAuthLogger := userLogger.WithGroup("auth")
26+
userAuthLogger.Info("用户权限验证完成", "userId", "12345", "role", "admin")
27+
28+
// 演示与 WithGroup 结合使用
29+
userGroupLogger := userLogger.WithGroup("session")
30+
userGroupLogger.Info("会话已创建",
31+
"sessionId", "abc123",
32+
"duration", "30m",
33+
)
1234

13-
loggerA = log.GetDefault()
14-
15-
loggerA = builder.Build()
16-
loggerA = builder.Develop()
17-
loggerA = builder.Test()
18-
loggerA = builder.Production()
19-
loggerA = builder.Silent()
20-
loggerA = builder.DevelopOnGoland()
21-
22-
loggerB = builder.FromConfiguration(
35+
// 演示完整的日志配置示例
36+
configuredLogger := builder.FromConfiguration(
2337
log.GetConfigBuilder().Build().
2438
WithWriter(os.Stdout).
2539
WithLeveler(log.LevelInfo),
2640
)
2741

28-
loggerB = builder.FromConfigurators(log.LoggerConfiguratorFn(func(config log.LoggerConfiguration) {
29-
config.WithEnableColor(true).WithLevelStr(log.LevelDebug, "debug")
30-
}))
42+
// 使用配置的日志记录器创建命名实例
43+
apiLogger := configuredLogger.WithGroup("api")
44+
apiLogger.Info("API服务启动成功", "port", 8080)
3145

32-
loggerC := builder.Multi(loggerA, loggerB)
33-
34-
loggerC.Error("Example", "err", errors.New("example error"))
35-
loggerC.Error("Example", log.Err(errors.New("example error")))
46+
// 演示多个日志记录器
47+
multiLogger := builder.Multi(
48+
apiLogger.WithGroup("service-a"),
49+
apiLogger.WithGroup("service-b"),
50+
)
51+
multiLogger.Error("服务间通信失败", log.Err(errors.New("timeout")))
3652
}

log/handler.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,20 @@ func (h *handler) Handle(ctx context.Context, record slog.Record) error {
5656
h.formatTime(ctx, record, builder, options)
5757
h.formatLevel(ctx, record, builder, options)
5858
h.formatCaller(ctx, record, builder, options)
59+
h.formatGroup(ctx, record, builder, options)
5960
h.formatMessage(ctx, record, builder, options)
6061

6162
// fixed attrs
6263
num := record.NumAttrs()
6364
fixedNum := len(h.attrs)
6465
for i, attr := range h.attrs {
65-
h.formatAttr(ctx, h.group, record.Level, attr, builder, num+fixedNum == i+1, options)
66+
h.formatAttr(ctx, record.Level, attr, builder, num+fixedNum == i+1, options)
6667
}
6768

6869
idx := 0
6970
record.Attrs(func(attr slog.Attr) bool {
7071
idx++
71-
h.formatAttr(ctx, h.group, record.Level, attr, builder, num == idx, options)
72+
h.formatAttr(ctx, record.Level, attr, builder, num == idx, options)
7273
return true
7374
})
7475

@@ -89,7 +90,11 @@ func (h *handler) WithAttrs(attrs []slog.Attr) slog.Handler {
8990

9091
func (h *handler) WithGroup(name string) slog.Handler {
9192
n := h.clone()
92-
n.group = name
93+
if h.group == "" {
94+
n.group = name
95+
} else {
96+
n.group = fmt.Sprintf("%s.%s", h.group, name)
97+
}
9398
return n
9499
}
95100

@@ -161,6 +166,18 @@ func (h *handler) formatCaller(ctx context.Context, record slog.Record, builder
161166
Write(' ')
162167
}
163168

169+
func (h *handler) formatGroup(ctx context.Context, record slog.Record, builder *colorbuilder.Builder, options LoggerOptionsFetcher) {
170+
if h.group == "" {
171+
return
172+
}
173+
174+
h.loadAttrKeyWithOptions(builder, AttrKeyMessage, options)
175+
h.loadColorWithOptions(builder, ColorTypeMessage, options).
176+
WriteString(h.group).
177+
DisableColor().
178+
WriteString(" ")
179+
}
180+
164181
func (h *handler) formatMessage(ctx context.Context, record slog.Record, builder *colorbuilder.Builder, options LoggerOptionsFetcher) {
165182
if record.Message == "" {
166183
return
@@ -177,17 +194,13 @@ func (h *handler) formatMessage(ctx context.Context, record slog.Record, builder
177194
Write(' ')
178195
}
179196

180-
func (h *handler) formatAttr(ctx context.Context, group string, level slog.Level, attr slog.Attr, builder *colorbuilder.Builder, last bool, options LoggerOptionsFetcher) {
181-
var key = attr.Key
182-
if group != "" {
183-
key = group + "." + key
184-
}
197+
func (h *handler) formatAttr(ctx context.Context, level slog.Level, attr slog.Attr, builder *colorbuilder.Builder, last bool, options LoggerOptionsFetcher) {
185198

186199
switch attr.Value.Kind() {
187200
case slog.KindGroup:
188201
groupAttr := attr.Value.Group()
189202
for _, a := range groupAttr {
190-
h.formatAttr(ctx, key, level, a, builder, last, options)
203+
h.formatAttr(ctx, level, a, builder, last, options)
191204
}
192205
return
193206
default:
@@ -209,18 +222,18 @@ func (h *handler) formatAttr(ctx context.Context, group string, level slog.Level
209222
}
210223
}
211224
attr = slog.Group(attr.Key, slog.Any("info", stackError{v}), slog.Any("stack", stacks))
212-
h.formatAttr(ctx, group, level, attr, builder, false, options)
225+
h.formatAttr(ctx, level, attr, builder, false, options)
213226
return
214227
}
215228
h.loadColorWithOptions(builder, ColorTypeAttrErrorKey, options)
216229
}
217230
}
218231

219232
builder.
220-
WriteString(key).
233+
WriteString(attr.Key).
221234
SetColor(options.FetchColorType(ColorTypeAttrDelimiter)).
222235
WriteString(options.FetchDelimiter())
223-
h.formatAttrValue(ctx, level, key, attr, builder, last, options)
236+
h.formatAttrValue(ctx, level, attr.Key, attr, builder, last, options)
224237
}
225238

226239
func (h *handler) formatAttrValue(ctx context.Context, level slog.Level, fullKey string, attr slog.Attr, builder *colorbuilder.Builder, last bool, options LoggerOptionsFetcher) {

0 commit comments

Comments
 (0)