140 lines
3.7 KiB
Markdown
140 lines
3.7 KiB
Markdown
|
|
# MIGRATION (V1)
|
|||
|
|
|
|||
|
|
本文档说明从旧版本/旧用法迁移到当前 `starlog` 的推荐路径。
|
|||
|
|
|
|||
|
|
## 先说结论
|
|||
|
|
|
|||
|
|
- 当前版本是 **V1 兼容迁移阶段**。
|
|||
|
|
- **旧 API 仍可继续使用,不需要立即重写。**
|
|||
|
|
- 推荐逐步迁移到 `Config` 快照方式和新能力(结构化、多 sink、脱敏、测试 hook)。
|
|||
|
|
|
|||
|
|
## 兼容性承诺(V1)
|
|||
|
|
|
|||
|
|
1. 不移除旧 API。
|
|||
|
|
2. 旧调用方式保持可运行。
|
|||
|
|
3. 新能力以“增量引入”为主,不要求一次性改造。
|
|||
|
|
|
|||
|
|
## 推荐迁移顺序
|
|||
|
|
|
|||
|
|
### 第 0 步:先不改业务逻辑
|
|||
|
|
|
|||
|
|
如果你当前线上稳定,可以先升级依赖并保持原写法。
|
|||
|
|
|
|||
|
|
### 第 1 步:把“多项配置”改为一次性更新
|
|||
|
|
|
|||
|
|
旧写法(仍可用):
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
log.SetShowColor(false)
|
|||
|
|
log.SetShowLevel(true)
|
|||
|
|
log.SetShowFlag(false)
|
|||
|
|
log.SetLevel(starlog.LvInfo)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
推荐写法(V1 新增):
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
log.UpdateConfig(func(cfg *starlog.Config) {
|
|||
|
|
cfg.ShowColor = false
|
|||
|
|
cfg.ShowLevel = true
|
|||
|
|
cfg.ShowFlag = false
|
|||
|
|
cfg.Level = starlog.LvInfo
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
收益:
|
|||
|
|
|
|||
|
|
- 多项配置原子生效,减少并发中间态。
|
|||
|
|
- 配置修改更集中,便于审计和 review。
|
|||
|
|
|
|||
|
|
### 第 2 步:逐步引入结构化字段与 Context
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
log.WithField("trace_id", traceID).Info("request done")
|
|||
|
|
log.WithContext(ctx).Error("call downstream failed")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 第 3 步:输出链路升级
|
|||
|
|
|
|||
|
|
- 单路写入升级到 `SetSinks(...)` / `MultiSink`
|
|||
|
|
- 需要分级分文件时使用 `RouteHandler`
|
|||
|
|
- 归档建议走 `RotatePolicy` 主路径,并叠加 `RotateManageOptions`
|
|||
|
|
|
|||
|
|
### 第 4 步:安全与测试
|
|||
|
|
|
|||
|
|
- 脱敏:`SetRedactor` / `AddRedactRule`
|
|||
|
|
- 测试断言:`Observer` / `TestHook`
|
|||
|
|
|
|||
|
|
### 第 5 步:生命周期收口(推荐)
|
|||
|
|
|
|||
|
|
旧写法(仍可用):
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
defer starlog.CloseStd()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
推荐写法:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
|||
|
|
defer cancel()
|
|||
|
|
defer starlog.Shutdown(ctx)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
说明:
|
|||
|
|
|
|||
|
|
- `Shutdown(ctx)` 会等待异步 handler drain,并统一关闭资源。
|
|||
|
|
- `Close()` 仍可用,但不等待异步 handler 队列。
|
|||
|
|
|
|||
|
|
## 常见旧写法到推荐写法
|
|||
|
|
|
|||
|
|
1. 配置项逐条 setter
|
|||
|
|
推荐:`UpdateConfig` 批量改
|
|||
|
|
|
|||
|
|
2. 只打印字符串
|
|||
|
|
推荐:关键路径增加 `WithField(s)` 与 `WithError`
|
|||
|
|
|
|||
|
|
3. 仅 writer 输出
|
|||
|
|
推荐:`MultiSink` + `RouteHandler` 做按级别拆分
|
|||
|
|
|
|||
|
|
4. 原生 `log.Logger` 接入
|
|||
|
|
推荐:`AsStdlibLoggerWithOptions`(prefix/flags/level-mapper)
|
|||
|
|
|
|||
|
|
5. 手工配置大量 setter
|
|||
|
|
推荐:`NewProductionConfig/NewDevelopmentConfig` + `ApplyProductionConfig/ApplyDevelopmentConfig`
|
|||
|
|
|
|||
|
|
6. 旧 `StartArchive` 轮转启动
|
|||
|
|
推荐:`StartRotatePolicy` / `StartManagedRotatePolicy`,模板场景可直接用 `StartRotateByTime/BySize/ByTimeSize`
|
|||
|
|
|
|||
|
|
## 旧 API 仍可用(重要)
|
|||
|
|
|
|||
|
|
以下旧/兼容路径当前仍可用:
|
|||
|
|
|
|||
|
|
- 旧 setter/getter 全部可用
|
|||
|
|
- 历史错拼兼容名仍可用(如 `EnbaleWrite`、`IsWriteStoed`、`HookBeforArchive`)
|
|||
|
|
- `Archive` 旧模型仍可用(建议新代码优先 `RotatePolicy`)
|
|||
|
|
- 旧生命周期入口仍可用(如 `CloseStd`、`Close`),但建议新代码优先 `Shutdown(ctx)` / `CloseLogFile`
|
|||
|
|
|
|||
|
|
## 升级后验证建议
|
|||
|
|
|
|||
|
|
1. 跑单元测试:`go test ./...`
|
|||
|
|
2. 跑并发检测:`go test -race ./...`
|
|||
|
|
3. 跑规则检查:`sentrux check .`
|
|||
|
|
4. 重点验证:
|
|||
|
|
- 级别过滤是否符合预期
|
|||
|
|
- 归档文件数量/保留策略
|
|||
|
|
- 异步丢弃计数和写入错误计数
|
|||
|
|
|
|||
|
|
## 何时需要进一步迁移
|
|||
|
|
|
|||
|
|
如果你符合以下场景,建议优先推进推荐写法:
|
|||
|
|
|
|||
|
|
- 多 goroutine 同时改日志配置
|
|||
|
|
- 需要跨模块统一日志字段规范
|
|||
|
|
- 需要审计日志(脱敏、分级路由、归档治理)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
如果你希望,我可以基于你当前项目的实际日志初始化代码,给出一份“一次改完可落地”的迁移 patch 方案。
|
|||
|
|
|