starlog/README.md
2026-03-19 16:37:57 +08:00

152 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# starlog
`starlog` 是一个面向生产环境的 Go 日志库,兼顾控制台可读性与服务端可观测性。
- Go 版本:`1.16+`
- 核心目标:可读、可控、可扩展、可观测
完整使用说明见 [docs/USAGE.md](./docs/USAGE.md),迁移说明见 [docs/MIGRATION.md](./docs/MIGRATION.md)。
## 快速开始
```go
package main
import (
"os"
"b612.me/starlog"
)
func main() {
log := starlog.NewStarlog(os.Stdout)
log.SetName("demo")
log.SetShowStd(true)
log.SetColorMode(starlog.ColorModeLevelOnly)
log.WithField("user_id", 42).Info("login ok")
log.WithError(os.ErrNotExist).Error("open file failed")
}
```
## 核心能力
- 结构化日志:`WithField/WithFields/WithError/WithContext`
- 级别过滤:`SetLevel/GetLevel/IsLevelEnabled/ParseLevel`
- 格式化输出:`TextFormatter``JSONFormatter`、自定义 `Formatter`
- 多路输出:`Sink``MultiSink``RouteHandler`
- 轮转能力:`RotatePolicy``StartRotate*``NewRotate*Sink`
- 关键词预设:`ApplyKeywordPreset/MergeKeywordPreset`(内置 `MobaLite/MobaFull`
- 高频防爆:去重、采样、限流
- 脱敏治理:规则式脱敏 + 失败策略
- 指标可观测写入错误、异步丢弃、pending、多 sink、轮转状态
- 生命周期收口:`Flush/Sync/Close/Shutdown`
- 并发配置:`Config` 快照 API`GetConfig/ApplyConfig/UpdateConfig`
## 核心接口
```go
type Handler interface { Handle(context.Context, *Entry) error }
type Formatter interface { Format(*Entry) ([]byte, error) }
type Sink interface { Write([]byte) error; Close() error }
type RotatePolicy interface {
ShouldRotate(FileInfo, *Entry) bool
NextPath(string, time.Time) string
}
// 可选扩展。若实现该接口,框架会优先使用 ArchivePath。
type RotateArchivePathProvider interface {
ArchivePath(string, time.Time) string
}
```
`NextPath` 的语义是“归档文件目标路径”。
## 关键词预设
内置预设:
- `KeywordPresetMobaLite`:常用关键词高亮(`error/true/warn/success` 等)
- `KeywordPresetMobaFull`:在 Lite 基础上扩展更多运行态词汇
```go
log := starlog.NewDevelopment(os.Stdout)
log.ApplyKeywordPreset(starlog.KeywordPresetMobaLite) // 覆盖现有关键词配置
// 在预设基础上继续自定义
log.SetKeywordColor("OOM", []starlog.Attr{starlog.FgHiRed, starlog.Bold})
// 可选匹配模式(默认关闭,兼容旧行为)
log.SetKeywordMatchOptions(starlog.KeywordMatchOptions{
IgnoreCase: true, // 忽略大小写
WholeWord: true, // 仅匹配完整单词
})
```
如需保留已有关键词并叠加预设,使用 `MergeKeywordPreset(...)`
## 轮转入口
推荐主路径:
- `StartRotatePolicy`
- `StartManagedRotatePolicy`
- `StartRotateByTime/StartRotateBySize/StartRotateByTimeSize`
- `StartManagedRotateByTime/StartManagedRotateBySize/StartManagedRotateByTimeSize`
RouteHandler 分流文件可直接使用轮转 sink
- `NewRotatePolicySink`
- `NewManagedRotatePolicySink`
- `NewRotateBy*Sink`
- `NewManagedRotateBy*Sink`
兼容入口:
- `StartArchive`(保留兼容,不推荐新代码使用)
## 生产初始化示例
```go
package main
import (
"context"
"time"
"b612.me/starlog"
)
func main() {
log := starlog.NewProduction(nil)
log.SetName("svc")
log.SetAutoAppendNewline(true)
if err := starlog.SetLogFile("./logs/app.log", log, true); err != nil {
panic(err)
}
if err := starlog.StartManagedRotateBySize(log, 200*1024*1024, 5, starlog.RotateManageOptions{
MaxBackups: 14,
MaxAge: 14 * 24 * time.Hour,
Compress: true,
Pattern: "20060102-150405",
}); err != nil {
panic(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
defer log.Shutdown(ctx)
log.WithField("module", "boot").Info("service started")
}
```
## 兼容策略
- 现有旧 API 仍可继续使用。
- 新功能优先通过新增 API 提供,不强制破坏式迁移。
- 新项目建议优先使用 `Config` API 与 `RotatePolicy` 主路径。