Documentation
¶
Overview ¶
Package yaklog 提供高性能零分配结构化日志库。
设计目标 ¶
- 零分配热路径:级别未启用或采样丢弃全路径零分配; 启用路径通过 sync.Pool 复用 Event 对象 + bufpool 复用缓冲。
- Send / Post 二元模型:Send 同步写入(无延迟),Post 异步投递包级 worker。
- Shutdown:进程退出阶段可调用 Shutdown() 停止接受新的 Post 并排空队列。
- JSON / Text 自动选择:Out 为 Console(...) 时自动切换 Text 编码器,其余使用 JSON。
- 全局 Config:yaklog.Config(opts) 热更新全局参数;New() 零参使用全局配置。
- 可插拔采样:内置 RateSampler(令牌桶)和 HashSampler(哈希固定采样)。
- ctx 注入:通过 WithTrace / WithField / WithLogger / WithEventSink 将上下文信息注入日志。
快速开始 ¶
// 使用默认配置(JSON 输出到 stderr)
l := yaklog.New()
l.Info().Str("service", "gateway").Int("port", 8080).Msg("启动").Send()
自定义配置 ¶
l := yaklog.New(yaklog.Options{
Out: yaklog.Console(os.Stdout),
Level: yaklog.Debug,
})
l.Debug().Str("key", "value").Send()
异步写入 + 等待排空 ¶
defer yaklog.Wait() // 进程退出前等待 Post 队列排空
l.Info().Msg("异步日志").Post()
派生子 Logger(Label 追加固定字段) ¶
sub := l.Label("module", "auth")
sub.Info().Msg("鉴权通过").Send()
独立 Logger(Fork 独立级别) ¶
dbLog := l.Fork() dbLog.SetLevel(yaklog.Debug) // 不影响 l
Index ¶
- Constants
- func Config(opts Options)
- func Console(w ...io.Writer) io.Writer
- func Discard() io.Writer
- func Dropped() int64
- func ErrCount() int64
- func GetFatalFunc() func(int)
- func GetPanicFunc() func(string)
- func Save(path ...string) io.Writer
- func SetFatalFunc(fn func(int))
- func SetOnDrop(fn func())
- func SetOnWriteError(fn func(error))
- func SetPanicFunc(fn func(string))
- func Shutdown() error
- func Wait()
- func WithEventSink(ctx context.Context, sink EventSink) context.Context
- func WithField(ctx context.Context, key string, val any) context.Context
- func WithLogger(ctx context.Context, l *Logger) context.Context
- func WithTrace(ctx context.Context, id [16]byte) context.Context
- type ColorScheme
- type Event
- func (e *Event) AnErr(key string, err error) *Event
- func (e *Event) Any(key string, val any) *Event
- func (e *Event) Bool(key string, val bool) *Event
- func (e *Event) Bytes(key string, val []byte) *Event
- func (e *Event) Caller() *Event
- func (e *Event) Ctx(ctx context.Context) *Event
- func (e *Event) Dur(key string, val time.Duration) *Event
- func (e *Event) Err(err error) *Event
- func (e *Event) Float64(key string, val float64) *Event
- func (e *Event) Int(key string, val int) *Event
- func (e *Event) Int64(key string, val int64) *Event
- func (e *Event) JSON(key string, raw []byte) *Event
- func (e *Event) Msg(msg string) *Event
- func (e *Event) Post()
- func (e *Event) Send()
- func (e *Event) Str(key, val string) *Event
- func (e *Event) Stringer(key string, val fmt.Stringer) *Event
- func (e *Event) Time(key string, val time.Time) *Event
- func (e *Event) Uint64(key string, val uint64) *Event
- type EventSink
- type HashSampler
- type LabelBuilder
- func (b LabelBuilder) Any(key string, val any) LabelBuilder
- func (b LabelBuilder) Bool(key string, val bool) LabelBuilder
- func (b LabelBuilder) Build() *Logger
- func (b LabelBuilder) Float64(key string, val float64) LabelBuilder
- func (b LabelBuilder) Int(key string, val int) LabelBuilder
- func (b LabelBuilder) Int64(key string, val int64) LabelBuilder
- func (b LabelBuilder) JSON(key string, raw []byte) LabelBuilder
- func (b LabelBuilder) Str(key, val string) LabelBuilder
- func (b LabelBuilder) Uint64(key string, val uint64) LabelBuilder
- type Level
- type Logger
- func (l *Logger) Closer() io.Closer
- func (l *Logger) Context(ctx context.Context) *Logger
- func (l *Logger) Debug() *Event
- func (l *Logger) Error() *Event
- func (l *Logger) Event(lvl Level) *Event
- func (l *Logger) Fatal() *Event
- func (l *Logger) Fork() *Logger
- func (l *Logger) GetLevel() Level
- func (l *Logger) Info() *Event
- func (l *Logger) Label(key string, val any) *Logger
- func (l *Logger) Labels() LabelBuilder
- func (l *Logger) Panic() *Event
- func (l *Logger) SetLevel(lvl Level)
- func (l *Logger) Tag(name string) *Logger
- func (l *Logger) To(out io.Writer) *Logger
- func (l *Logger) Trace() *Event
- func (l *Logger) Wait()
- func (l *Logger) Warn() *Event
- type Options
- type RateSampler
- type Sampler
- type TimeFormat
Constants ¶
const ( // ErrWriterClosed 包级 worker 已关闭或已执行 Shutdown,不再接受新 Post 任务。 ErrWriterClosed = yakutil.ErrStr("yaklog: worker closed") // ErrInvalidPath 日志文件路径不合法(如空字符串或无法解析为绝对路径)。 ErrInvalidPath = yakutil.ErrStr("yaklog: invalid file path") // ErrNotLogFile 目标路径指向的已有文件疑似二进制/可执行文件,拒绝覆盖写入。 // 触发条件:文件已存在且(含可执行权限位 0111,或前缀匹配已知二进制 magic)。 ErrNotLogFile = yakutil.ErrStr("yaklog: target file is not a log file") // ErrInvalidOpts 配置参数不合法(如队列容量超限)。 ErrInvalidOpts = yakutil.ErrStr("yaklog: invalid options") )
const ConsoleTimeDateMicro = "2006-01-02 15:04:05.000000"
ConsoleTimeDateMicro Console 输出时间格式,日期+时间,微秒精度。 示例:2026-03-08 16:38:43.152148
const ConsoleTimeDateMilli = "2006-01-02 15:04:05.000"
ConsoleTimeDateMilli Console 输出时间格式,日期+时间,毫秒精度。 示例:2026-03-08 16:38:43.152
const ConsoleTimeMicro = "15:04:05.000000"
ConsoleTimeMicro Console 输出时间格式,仅时间,微秒精度。 示例:16:38:43.152148
const ConsoleTimeMilli = "15:04:05.000"
ConsoleTimeMilli Console 输出时间格式,仅时间,毫秒精度(默认)。 示例:16:38:43.152
const ConsoleTimeRFC3339Milli = "2006-01-02T15:04:05.000Z07:00"
ConsoleTimeRFC3339Milli Console 输出时间格式,RFC3339 含毫秒与时区偏移。 示例:2026-03-08T16:38:43.152+08:00
Variables ¶
This section is empty.
Functions ¶
func Config ¶
func Config(opts Options)
Config 设置全局默认 Options,影响后续所有 New()(零参)调用。并发安全(原子替换)。
可多次调用,但 QueueLen 和 FlushInterval 仅首次调用(或首次 New())时生效—— 包级 worker 由 sync.Once 保证只启动一次;其余字段每次调用均生效。 建议在 main() 最开始调用一次完成初始化。
func Console ¶
Console 创建彩色文本 Sink,输出到指定 writer(默认 os.Stderr)。
Logger 检测到此 Sink 后自动使用 textEncoder,热路径零分配无需 JSON 解析。 ConsoleTimeFormat 由 Options.ConsoleTimeFormat 控制(零值使用 ConsoleTimeMilli)。
func ErrCount ¶
func ErrCount() int64
ErrCount 返回全部写入错误次数(Post 异步路径 + Send 同步路径)。 可配合 Dropped() 监控日志流健康。
func Save ¶
Save 创建基于文件的 JSON Sink,支持按大小自动轮转。
使用形式:
- Save("./logs/app.log") — 显式指定路径
- Save() — 使用 Options.FilePath(在 New 时解析)
轮转参数(MaxSize/MaxAge/MaxBackups/Compress/LocalTime)来自 Logger 的 Options。 返回的 io.Writer 同时实现 io.Closer;调用方可通过 Logger.Closer() 取回并在退出时关闭。
func SetFatalFunc ¶
func SetFatalFunc(fn func(int))
SetFatalFunc 替换 Fatal 级别触发的退出函数,默认为 os.Exit。
典型用法:在 TestMain 或具体测试函数开头替换,测试结束后通过 defer 还原。
old := yaklog.GetFatalFunc()
defer yaklog.SetFatalFunc(old)
yaklog.SetFatalFunc(func(code int) { /* 捕获退出码,不真正退出 */ })
func SetOnDrop ¶
func SetOnDrop(fn func())
SetOnDrop 注册 Post 队列满丢弃日志时的回调。 回调在 postTask 调用方 goroutine 中同步执行,须快速返回,不可阻塞。 传 nil 可清除回调。可搭配 yakevent 使用:
bus, _ := yakevent.ForAsync()
yaklog.SetOnDrop(func() { bus.Emit(&yakevent.Event{Type: "log.drop"}) })
func SetOnWriteError ¶
func SetOnWriteError(fn func(error))
SetOnWriteError 注册异步写入失败时的回调,参数为底层 io.Writer 返回的 error。 回调在 worker goroutine 中同步执行,须快速返回,不可阻塞或 panic。 传 nil 可清除回调。
yaklog.SetOnWriteError(func(err error) { metrics.LogWriteErrors.Inc() })
func SetPanicFunc ¶
func SetPanicFunc(fn func(string))
SetPanicFunc 替换 Panic 级别触发的 panic 函数,默认为内置 panic。
典型用法:在 TestMain 或具体测试函数开头替换,测试结束后通过 defer 还原。
old := yaklog.GetPanicFunc()
defer yaklog.SetPanicFunc(old)
yaklog.SetPanicFunc(func(msg string) { /* 捕获消息,不真正 panic */ })
func Shutdown ¶
func Shutdown() error
Shutdown 停止接受新的 Post 任务,排空当前队列并关闭包级 worker。
它适合进程退出阶段使用:比 Wait 更强,会在排空后拒绝后续异步投递。 调用成功后,后续 Post 会被忽略,并通过 OnWriteError 回调报告 ErrWriterClosed。
func Wait ¶
func Wait()
Wait 等待所有已提交的 Post 任务写入完成。通常在 main 函数最后调用。
原理:向 worker 发送屏障请求,worker 排空所有已入队条目后应答。 安全性:Wait 期间不应有并发的 Post 调用;若有,这些后续投递不保证被本次 Wait 覆盖,但不会引发崩溃或数据损坏。调用前应确保所有 Post 生产方已停止提交。
func WithEventSink ¶
WithEventSink 将 EventSink 注入 context,返回新 context。
func WithField ¶
WithField 将任意键值对注入 context,返回新 context。
同一 key 多次注入时,后注入的覆盖先注入的(context 链语义)。 Logger.Context(ctx) 绑定或 Event.Ctx(ctx) 时,这些字段会自动追加到每条日志。
func WithLogger ¶
WithLogger 将 *Logger 注入 context,返回新 context。
FromCtx 可取出此 Logger;通常在 middleware 中绑定带请求信息的子 Logger。
Types ¶
type ColorScheme ¶
type ColorScheme struct {
Trace string // Trace 级别色(含 level 标识及 Msg 文本);默认 "\x1b[90m"(暗灰)
Debug string // Debug 级别色;默认 "\x1b[36m"(青色)
Info string // Info 级别色;默认 "\x1b[32m"(绿色)
Warn string // Warn 级别色;默认 "\x1b[33m"(黄色)
Error string // Error 级别色;默认 "\x1b[31m"(红色)
Panic string // Panic 级别色;默认 "\x1b[1;35m"(加粗洋红)
Fatal string // Fatal 级别色;默认 "\x1b[1;31m"(加粗红色)
Time string // 时间戳色;默认 "\x1b[2m"(暗淡 dim)
Key string // 字段 key= 色;默认 "\x1b[34m"(暗蓝)
Tag string // Tag 标签色;默认 "\x1b[38;5;166m"(橙色 256色)
Source string // source 字段值色;默认 "\x1b[93m"(亮黄)
}
ColorScheme 定义 Console 输出的 ANSI 颜色方案,允许用户替换任意元素的颜色。 零值(空字符串)字段使用内置默认色,无需填写全部字段。 仅在 Out = Console() 时生效;JSON 格式及 ConsoleNoColor=true 时忽略所有颜色配置。
ANSI 转义码格式:"\x1b[<code>m",例如 "\x1b[32m" 为绿色,"\x1b[1;33m" 为加粗黄色。 支持的标准颜色代码:30–37(暗色前景)、90–97(亮色前景)、1;3x(加粗前景)等。 终端 256 色格式:"\x1b[38;5;<n>m";真彩色格式:"\x1b[38;2;<r>;<g>;<b>m"。
type Event ¶
type Event struct {
// contains filtered or unexported fields
}
Event 代表一条正在构建的日志事件。
通过 Logger.Info() / Logger.Debug() 等方法获取;级别未启用时返回 nil。 所有链式方法均 nil-safe:(*Event)(nil).Str(...) 合法且返回 nil,零分配。
生命周期:Event 由 eventPool(sync.Pool)管理; 调用 Send() / Post() 后 buf 所有权转移,Event 归还 pool。 Send / Post 调用后不得再引用该 Event。
func (*Event) Bytes ¶
Bytes 追加 []byte 字段(零拷贝 B2S,适合 UTF-8 数据)。
B2S 在 Bytes() 调用期间将 val 临时转为 string 并传入 appendJSONStr; appendJSONStr 在本次调用内同步将內容拷贝进 e.buf,之后不再持有 val 引用。 因此 val 只需在 Bytes() 调用期间保持有效,无需延续至 Send/Post。
func (*Event) Caller ¶
Caller 为此事件附加调用方 file:line(source 字段)。
适合在特定日志点按需附加定位信息,无需全局开启 Options.Source。 若 Options.Source 已全局启用,Caller() 捕获的 PC 更准确(在链式调用处采集,而非 Send/Post 处)。 调用后返回同一 *Event,可继续链式调用。
func (*Event) Ctx ¶
Ctx 以 ctx 替换此事件的上下文(覆盖 Logger 的 boundCtx)。
可从 ctx 中提取 WithTrace / WithField 注入的字段。
func (*Event) Err ¶
Err 追加 error 字段(key = "error")。err 为 nil 时不追加任何字段。 Console 模式下,error 字段的展示色与当前日志级别一致(如 Error 级别红色)。
func (*Event) JSON ¶
JSON 追加已序列化的原始 JSON bytes 作为字段值(零分配)。
JSON 输出模式下 raw 直接嵌入为嵌套对象,不做二次转义。 Console 输出模式下 raw 作为字段值原样输出。 调用方负责保证 raw 是合法 JSON;raw 为 nil 时跳过该字段。
Console 模式注意:若 raw 包含换行符(如美化格式的 JSON),输出行会被拆分, 可能导致结构化日志解析器丢失字段关联。建议 Console 模式下传入紧凑格式 JSON。
func (*Event) Post ¶
func (e *Event) Post()
Post 异步写入:将 buf 投递给包级 worker goroutine,不阻塞调用方。
适合大并发高吞吐场景。进程退出前应调用 yaklog.Wait() 或 logger.Wait() 排空。 调用后不得再引用该 Event。
func (*Event) Send ¶
func (e *Event) Send()
Send 同步写入:在调用方 goroutine 中直接 io.Write,不经过 worker 队列。
写入完成后 goroutine 继续,适合对延迟敏感的场景或需要等待结果的场景。 调用后不得再引用该 Event。
type EventSink ¶
EventSink 事件挂载接口。实现此接口可在每条日志写入时同步触发事件 (如向 yakevent 总线发布告警)。
Emit 在日志编码完成后、写入目标前被同步调用。 实现须并发安全,且不得持有 fields 引用(传入的是当前日志行的独立副本)。 若 Emit 内部发生 panic,yaklog 会隔离并吞掉该 panic,避免影响日志主流程。
type HashSampler ¶
type HashSampler struct {
// contains filtered or unexported fields
}
HashSampler 基于消息哈希的固定比例采样器。
对相同 level+msg 组合哈希后与阈值比较,保证同一来源的记录以稳定比例输出, 避免令牌桶的时间窗口倾斜问题。 并发安全:热路径纯整数运算,无共享可变状态,零分配。
种子范围:maphash.MakeSeed 在进程启动时随机化(AES-NI 加速,防哈希碰撞预测)。 相同消息在同一进程内的采样结果稳定一致;不同进程间由于种子不同结果将不同, 不应依赖跨进程的采样确定性。
各级别独立限额:limits[uint8(level)&7] 存储每个日志级别的采样阈值。 级别到索引的映射: Trace(-2)→6、Debug(-1)→7、Info(0)→0、Warn(1)→1、Error(2)→2、Panic(3)→3、Fatal(4)→4。 采样率支持在运行时通过 HashSampler.SetRate 和 HashSampler.SetRateForLevel 更新; 新率平均在一次原子写后对所有 goroutine 可见。
注意:当作为 Logger.Sampler 使用时,采样发生在 Msg() 调用之前, msg 参数始终为空字符串。此时采样仅基于 level 粒度,而不是基于消息内容。 如需基于消息内容做稳定采样,应在应用层自行调用 Sample()。
func NewHashSampler ¶
func NewHashSampler(rate float64) *HashSampler
NewHashSampler 创建固定比例采样器,所有级别使用相同初始采样率。
- rate:采样率,范围 (0, 1.0];1.0 表示全量输出,0.01 表示 1%。
func (*HashSampler) Sample ¶
func (s *HashSampler) Sample(level Level, msg string) bool
Sample 实现 Sampler 接口,对 level+msg 哈希后与该级别的阈值比较。 热路径:maphash.String 单次调用(AES-NI 加速),level 以黄金比例常数混入,零分配。
当 Logger.Sampler 调用时 msg 为空字符串(采样在 Msg() 之前执行), 此时哈希结果仅由 level 决定——即对同一级别按固定比例采样。
func (*HashSampler) SetRate ¶
func (s *HashSampler) SetRate(rate float64)
SetRate 修改所有级别的采样率。原子写入,对所有 goroutine 单次内存屏障后可见。 rate 范围 (0, 1.0];超出范围自动酆位。
func (*HashSampler) SetRateForLevel ¶
func (s *HashSampler) SetRateForLevel(level Level, rate float64)
SetRateForLevel 修改指定级别的采样率。原子写入,对所有 goroutine 单次内存屏障后可见。 让不同级别使用不同的采样率,例如 Error/Warn 全量输出而 Debug 只输出 10%。 rate 范围 (0, 1.0];超出范围自动酆位。
type LabelBuilder ¶
type LabelBuilder struct {
// contains filtered or unexported fields
}
LabelBuilder 批量追加固定字段的构建器。
相比多次调用 Label(每次 clone 一个 Logger),LabelBuilder 只在 Build 时 做一次 clone,减少中间 Logger 的堆分配(N 次 Label → N alloc → 1 alloc)。
使用方式:
sub := l.Labels().Str("module", "auth").Int("shard", 3).Build()
LabelBuilder 使用值接收器,典型内联用法下可栈分配(零堆 alloc)。
func (LabelBuilder) Any ¶
func (b LabelBuilder) Any(key string, val any) LabelBuilder
Any 追加任意类型字段(通过 yakjson 序列化,有分配)。
func (LabelBuilder) Bool ¶
func (b LabelBuilder) Bool(key string, val bool) LabelBuilder
Bool 追加 bool 字段。
func (LabelBuilder) Build ¶
func (b LabelBuilder) Build() *Logger
Build 完成构建,返回新 Logger(仅此处做一次构造)。
返回的 Logger 与原 Logger 共享 level 和 wg(与 Label 行为一致)。
func (LabelBuilder) Float64 ¶
func (b LabelBuilder) Float64(key string, val float64) LabelBuilder
Float64 追加 float64 字段。
func (LabelBuilder) Int ¶
func (b LabelBuilder) Int(key string, val int) LabelBuilder
Int 追加 int 字段。
func (LabelBuilder) Int64 ¶
func (b LabelBuilder) Int64(key string, val int64) LabelBuilder
Int64 追加 int64 字段。
func (LabelBuilder) JSON ¶
func (b LabelBuilder) JSON(key string, raw []byte) LabelBuilder
JSON 追加已序列化的原始 JSON bytes 作为字段值(零分配)。 raw 为 nil 时跳过该字段。
func (LabelBuilder) Uint64 ¶
func (b LabelBuilder) Uint64(key string, val uint64) LabelBuilder
Uint64 追加 uint64 字段。
type Logger ¶
type Logger struct {
// contains filtered or unexported fields
}
Logger 高性能结构化日志器。
通过 New() 创建;通过 Label / Fork / Context / To 派生子 Logger。 Logger 对象可赋值传递(字段均为指针/切片),并发安全。
生命周期:Logger 持有的 closer(若 Out 是 io.Closer)在进程退出时 由调用方管理(应用级 defer closer.Close());yaklog 本身不注册 finalizer。
func New ¶
New 创建 Logger 实例。
- 零参:完全使用全局 Config() 的 Options
- 有参:完全使用传入的 Options(完整覆盖,不 merge 全局)
包级 worker 在第一次调用 New 或 Config 时惰性启动。
func (*Logger) Closer ¶
Closer 返回底层写入器的 io.Closer(如 RotatingWriter)。 若 Out 不实现 io.Closer,返回 nil。调用方可在 defer 中关闭。
func (*Logger) Context ¶
Context 将 ctx 绑定到 Logger,返回新 Logger。
绑定后该 Logger 的每条日志自动提取 ctx 中注入的字段(trace_id、WithField 字段)。 无需再在每条 Event 上调用 .Ctx(ctx),但 Event.Ctx(ctx) 仍可覆盖。
func (*Logger) Event ¶
Event 创建指定级别的日志事件。nil 表示级别未启用(零分配)。
适用于级别由运行时决定的场景(如 slog 适配器),避免 switch 分派开销。
func (*Logger) Fork ¶
Fork 派生独立 Logger:拥有独立的 level 原子变量和 wg,不受父级 SetLevel 影响。
通常在需要对某个子模块独立控制日志级别时调用(如 db 模块 Debug 而全局 Info)。
func (*Logger) Label ¶
Label 追加一个固定字段,返回新 Logger(共享 level 和 wg)。
线程安全:原 Logger 不受影响;派生后各自 prefix 独立。 val 支持 string / int / int64 / uint64 / float64 / bool,其他类型通过 any 序列化。
func (*Logger) Labels ¶
func (l *Logger) Labels() LabelBuilder
Labels 返回预填充当前 prefix 的 LabelBuilder。
后续通过 Str / Int / Bool 等方法追加字段,最后调用 Build() 生成新 Logger。
func (*Logger) Panic ¶
Panic 创建 Panic 级别日志事件。Send/Post 后同步写入日志,然后调用 PanicFunc(默认为内置 panic)。 PanicFunc 默认可被 defer/recover 捕获;可通过 SetPanicFunc 替换,与 Fatal 的差异在于可恢复性。
func (*Logger) SetLevel ¶
SetLevel 热更新最低输出级别。对所有共享此 level 指针的 Logger(Label 派生链)生效。 Fork 派生的子 Logger 有独立指针,互不影响。
func (*Logger) Tag ¶
Tag 设置一个组件标签,返回新 Logger(共享 level 和 wg)。
Console 模式下标签紧跟级别标识后渲染为 [name](洋红色),格式示例:
10:30:00.123 I [cache] key=val message
JSON 模式下渲染为 "tag":"name" 字段,位于 level 字段之后。 标签不占用 Label 前缀空间,不参与 Label 字段编码,仅影响记录头部输出。
func (*Logger) To ¶
To 替换输出目标,返回新 Logger。编码器根据新 Out 类型重新选择。
传入 nil 时,派生 Logger 的所有写入操作静默丢弃,并通过 OnWriteError 通知 ErrWriterClosed,同时计入 ErrCount。可用于彻底静默某个 Logger 分支。
派生后与原 Logger 共享 level/wg,但 out 和 enc 独立。
func (*Logger) Trace ¶
Trace 创建 Trace 级别日志事件。nil 表示级别未启用(零分配)。
级别检查内联于此,disabled 路径无需调用 newEvent 函数,节省函数调用开销。
type Options ¶
type Options struct {
// ── 基础 ──────────────────────────────────────────────────────────────
Level Level // 最低输出级别,零值为 Info
Out io.Writer // 输出目标;nil 且 FilePath 空 → JSON os.Stderr
FilePath string // 日志文件路径;Out 为 nil 时自动 Save(FilePath)
Source bool // 是否附加调用方 file:line(有轻微性能开销)
// CallerFunc 自定义 source 字段的显示值,接收原始 file 路径和行号,返回最终写入日志的字符串。
// 返回空字符串则完全省略该字段。nil 表示使用默认行为(完整 file:line)。
// 常用于:只保留文件名(filepath.Base(file))、路径脱敏、相对路径截取等场景。
CallerFunc func(file string, line int) string
TimeFormat TimeFormat // 时间戳格式,零值为 TimeRFC3339Milli
Sampler Sampler // 采样器,nil 表示全量输出
// ── 异步 Post 队列 ────────────────────────────────────────────────────
QueueLen int // 包级 worker channel 容量;0 → defaultQueueLen
FlushInterval time.Duration // 周期刷写间隔;0 → 100ms
// ── 文件轮转(Out = Save(...) 时生效)────────────────────────────────
FileMaxSize int // 单文件最大体积(MB);0 → 100
FileMaxAge int // 备份文件最长保留天数;0 → 不限制
FileMaxBackups int // 最多保留旧文件数;0 → 不限
FileCompress bool // 是否压缩旧文件
FileLocalTime bool // 备份文件名时间戳使用本地时间(false = UTC)
// ── Console 格式(Out = Console() 时生效)────────────────────────────
// ANSI 颜色:Console() 默认启用,设 ConsoleNoColor=true 可关闭。
// 启用后:级别有独立色彩,字段 key 以灰度(dim)弱化显示。
ConsoleNoColor bool // true = 关闭 ANSI 颜色输出(默认 false,即颜色默认开启)
// 级别显示:默认单字母简写(T/D/I/W/E/P/F),设 ConsoleLevelFull=true 使用完整名称(TRACE/DEBUG/INFO...)。
ConsoleLevelFull bool // true = 完整级别名(TRACE/INFO/WARN...);false(默认)= 单字母简写(T/I/W...)
ConsoleTimeFormat string // Console 时间格式;空 → ConsoleTimeMilli
ColorScheme ColorScheme // Console ANSI 颜色方案;零值字段使用内置默认色;ConsoleNoColor=true 时忽略
}
Options 是 Logger 全量配置结构体,零值即可直接使用(零值 = 全部默认值)。
零值含义:
- Level → Info(int8 零值恰好是 Info 的值 0)
- Out → nil,New() 中 fallback 到 JSON → os.Stderr
- FilePath → 空,Out 非 nil 时忽略;Out 为 nil 且 FilePath 非空时自动 Save
- TimeFormat → TimeRFC3339Milli(iota=0)
- QueueLen → 0,New() 中补 defaultQueueLen
- 其余 bool → false
type RateSampler ¶
type RateSampler struct {
// contains filtered or unexported fields
}
RateSampler 基于令牌桶算法的速率采样器(复用 yakutil/ratelimit.Limiter)。
每秒最多允许 rate 条记录通过,突发上限为 burst 条。 超出速率的记录被静默丢弃。 热路径:单次原子 CAS,无锁,无 goroutine,零分配。
func NewRateSampler ¶
func NewRateSampler(rate, burst int) *RateSampler
NewRateSampler 创建令牌桶采样器。
- rate:每秒允许通过的最大记录数(> 0)
- burst:突发令牌桶容量(> 0)
type TimeFormat ¶
type TimeFormat uint8
TimeFormat JSON 输出时间戳格式,零值为 TimeRFC3339Milli。
const ( TimeRFC3339Milli TimeFormat = iota // 默认,"2026-03-08T10:30:00.123Z" TimeUnixSec // 秒级 Unix 时间戳,如 1741426200 TimeUnixMilli // 毫秒级,如 1741426200123 TimeUnixNano // 纳秒级,如 1741426200123456789 TimeOff // 不输出时间字段 )
