logger

package module
v2.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 12, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

README

logger/v2

基于 zap 的实例化日志封装,提供 Structured / Sugar 双模式、文件切割、消息推送 Hook,以及按 channel 分类写入不同日志文件的能力。

安装

go get github.com/gtkit/logger/v2@latest

发布规范

  • v2/go.mod 的模块路径必须保持为 github.com/gtkit/logger/v2
  • 当前仓库采用“仓库根目录 + major version 子目录 ./v2”布局,发布 tag 必须使用 v2.x.y,不能使用 v2/v2.x.y
  • v2/Makefile 中的 make tag 会创建正确的 v2.x.y tag。
  • 历史上如果误打了 v2/v2.x.y,不要删除或改写旧 tag;应补充创建同提交上的规范 tag。可先在本地执行 make fix-tags 生成缺失的 v2.x.y tag,再按需推送。

快速开始

package main

import (
	"github.com/gtkit/logger/v2"
	"go.uber.org/zap"
)

func main() {
	log := logger.MustNew(
		logger.WithPath("./logs/app"),
		logger.WithLevel("info"),
		logger.WithOutJSON(true),
		logger.WithConsole(true),
		logger.WithFile(true),
		logger.WithDivision("daily"),
		logger.WithChannel("order",
			logger.WithChannelPath("./logs/channels/order"),
			logger.WithChannelDuplicateToDefault(true),
		),
		logger.WithChannel("audit",
			logger.WithChannelPath("./logs/channels/audit"),
			logger.WithChannelDuplicateToDefault(false),
		),
	)
	defer log.Sync()

	log.Info("request processed",
		zap.String("method", "GET"),
		zap.Int("status", 200),
	)

	log.With(zap.String("request_id", "req-1")).
		Channel("order").
		Named("api").
		Info("order created", zap.String("order_id", "A100"))

	log.Channel("audit").Warn("role changed", zap.String("operator", "admin"))

	log.HError("payment failed", zap.String("order_id", "A100"))
}

基本行为

  • log.Info(...) 只写默认日志输出。
  • log.Channel("name").Info(...) 会自动附加 channel=name 字段。
  • 未显式配置的 channel 只写默认日志输出,不会自动创建独立文件。
  • 显式配置的 channel 会写入自己的文件。
  • 显式配置的 channel 默认会同时写入默认日志输出;可通过 WithChannelDuplicateToDefault(false) 改成只写 channel 文件。
  • channel 文件继承全局日志级别、编码格式、切割方式、保留天数、备份数量和压缩策略。
  • logger 会自动创建日志文件的父目录。
  • 如果 channel 路径与默认路径相同,并且开启双写,初始化会直接失败,避免同一条日志被重复写入同一个文件。

Channel 配置

注册一个 channel
log := logger.MustNew(
	logger.WithPath("./logs/app"),
	logger.WithChannel("order",
		logger.WithChannelPath("./logs/channels/order"),
		logger.WithChannelDuplicateToDefault(true),
	),
)

生成的 channel 文件名仍然沿用现有规则:

  • size 模式: {channelPath}-{level}.log
  • daily 模式: {channelPath}-{level}-2006-01-02.log
未配置 channel
log.Channel("payment").Info("payment callback received")

这条日志只会进入默认输出,但日志内容里会带上 channel=payment 字段,方便检索。

配置后双写
logger.WithChannel("order",
	logger.WithChannelPath("./logs/channels/order"),
	logger.WithChannelDuplicateToDefault(true),
)

这条 channel 日志会同时进入:

  • 默认日志输出
  • ./logs/channels/order-<level>.log
配置后单写
logger.WithChannel("audit",
	logger.WithChannelPath("./logs/channels/audit"),
	logger.WithChannelDuplicateToDefault(false),
)

这条 channel 日志只会进入 channel 文件,不会进入默认日志输出。

配置项

全局 Option
Option 说明 默认值
WithPath(p) 默认日志文件路径前缀 ./logs/
WithLevel(l) 日志级别 info
WithOutJSON(b) 是否输出 JSON false
WithDurationEncoder(enc) 自定义 time.Duration 编码方式,例如 zapcore.StringDurationEncoder zapcore.SecondsDurationEncoder
WithConsole(b) 是否输出到控制台 false
WithFile(b) 是否输出到文件 true
WithDivision(d) 切割方式: size / daily size
WithMaxSize(mb) 单文件最大 MB 512
WithMaxAge(days) 最大保留天数 7
WithMaxBackups(n) 最大备份数量 50
WithCompress(b) 是否压缩归档 true
WithMessager(m) 外部消息推送 Hook nil
WithBuffered(b) 是否启用缓冲写入(BufferedWriteSyncer) false
WithBufferSize(n) 缓冲区大小(字节),仅 WithBuffered(true) 时生效 256KB
WithFlushInterval(d) 缓冲区自动刷写间隔,仅 WithBuffered(true) 时生效 30s
WithChannel(name, ...opts) 注册独立 channel 文件路由
ChannelOption
Option 说明 默认值
WithChannelPath(path) channel 文件路径前缀 必填
WithChannelDuplicateToDefault(b) 是否同时写入默认日志输出 true

日志切割

size 模式

文件名格式:

{path}-{level}.log

由 lumberjack 按文件大小自动 rotate。

daily 模式

文件名格式:

{path}-{level}-2006-01-02.log

每天切换到新文件;同一天内超过 MaxSize 时,仍由 lumberjack 按大小继续 rotate。

第三方库适配器

// robfig/cron
cron.New(cron.WithLogger(logger.NewCronAdapter(log)))

// elastic/go-elasticsearch
es, _ := elasticsearch.NewClient(elasticsearch.Config{
	Logger: logger.NewESAdapter(log),
})

// go-resty/resty
client := resty.New().SetLogger(logger.NewRestyAdapter(log))

注意:适配器参数 log 不能为 nil,否则会 panic。

消息推送

type Messager interface {
	Send(msg string)
	SendTo(url, msg string)
}

log := logger.MustNew(
	logger.WithMessager(myFeishuMessager),
)

log.HError("payment failed", zap.String("order_id", "12345"))
H 系列方法一览

H 前缀的方法 = 写日志 + 调用 Messager.Send()。普通方法(Info / Error 等)只写日志;H 方法在写日志成功后额外触发消息推送:

方法 日志级别 推送目标
HInfo(msg, fields...) Info Messager.Send
HInfof(format, args...) Info Messager.Send
HInfoTo(url, msg, fields...) Info Messager.SendTo(url, ...)
HInfoTof(url, format, args...) Info Messager.SendTo(url, ...)
HError(msg, fields...) Error Messager.Send
HErrorf(format, args...) Error Messager.Send
HErrorTo(url, msg, fields...) Error Messager.SendTo(url, ...)
HErrorTof(url, format, args...) Error Messager.SendTo(url, ...)

未配置 WithMessager 时,H 方法等价于普通方法(推送部分静默跳过)。

slog 桥接

将 Go 标准库 log/slog 的日志统一写入 zap,适用于第三方库使用 slog 输出日志的场景:

import "log/slog"

slog.SetDefault(slog.New(log.SlogHandler()))

// 之后所有 slog 调用都会写入 zap 管道
slog.Info("third-party log", "key", "value")

// 支持 slog.Group 嵌套结构
slog.Info("request",
	slog.Group("request",
		slog.String("method", "POST"),
		slog.Int("status", 201),
	),
)

API 方法一览

License

Apache-2.0. See ../LICENSE.

Structured(高性能,类型安全)

DebugInfoWarnErrorDPanicPanicFatal

Sugar — fmt 风格

DebugfInfofWarnfErrorfDPanicfPanicfFatalf

Sugar — key-value 风格

DebugwInfowWarnwErrorw

log.Infow("request processed", "method", "GET", "status", 200)
log.Errorw("query failed", "table", "orders", "err", err)

以上所有方法在 Channel 上同样可用:

log.Channel("order").Infow("created", "order_id", "A100")
Context 注入(自动合并 contextFields)
  • 结构化字段:DebugCtxInfoCtxWarnCtxErrorCtx
  • Sugar key-value:DebugwCtxInfowCtxWarnwCtxErrorwCtx
条件日志(err != nil 才记录)
  • LogIf(err) / WarnIf(err):Error / Warn 级别
  • LogIfCtx(ctx, err) / WarnIfCtx(ctx, err):带 ctx 字段注入
Hook 推送(写日志 + Messager.Send)

HInfoHInfofHInfoToHInfoTofHErrorHErrorfHErrorToHErrorTof —— 详见上文 "H 系列方法一览" 章节

写入模式:WriteSyncer vs BufferedWriteSyncer

默认使用 WriteSyncer(同步写入),可通过 WithBuffered(true) 切换为 BufferedWriteSyncer(缓冲写入)。两者的核心区别在于日志数据从用户调用到真正落盘之间的路径不同。

内部原理

WriteSyncer(同步写入):

log.Info("msg") → zap 编码 → lumberjack.Write() → os.File.Write() → 内核缓冲区 → 磁盘
                               ↑ 每条日志都走一次完整的 write 系统调用

BufferedWriteSyncer(缓冲写入):

log.Info("msg") → zap 编码 → BufferedWriteSyncer.Write() → 内存缓冲区(用户态)
                                                                 │
                           缓冲区满 或 定时器到期 ──────────────────┘
                                                                 ↓
                           lumberjack.Write() → os.File.Write() → 内核缓冲区 → 磁盘
                           ↑ 多条日志合并为一次 write 系统调用

关键差异:BufferedWriteSyncer 在 zap 与底层 writer 之间插入了一层用户态内存缓冲区,将多次小写入合并为少量大写入,从而减少系统调用次数。

全维度对比
对比项 WriteSyncer(默认) BufferedWriteSyncer
写入方式 每条日志立即写入磁盘 先写入内存缓冲区,满或到期后批量刷盘
系统调用 每条日志 1 次 write syscall N 条日志合并为 1 次 write syscall
写入延迟 无——调用返回即已写入内核缓冲区 有——取决于缓冲区大小和刷写间隔(默认最多 30 秒)
写入性能 高频写入时 I/O 开销大 高吞吐场景性能提升约 3-4 倍
内存占用 无额外内存 额外占用缓冲区大小的内存(默认 256KB)
正常退出 Sync() 调用 os.File.Sync(),数据已在磁盘 Sync() 先 flush 缓冲区再 sync,数据落盘,不丢日志
异常退出 已写入内核缓冲区的数据通常不丢 用户态缓冲区中未 flush 的数据会丢失
丢失窗口 几乎为零 最多丢失 1 个缓冲区周期的日志(默认最多 30 秒或 256KB)
线程安全 由底层 lumberjack 的 mutex 保证 BufferedWriteSyncer 自带 mutex,再调用底层 writer
适用场景 大多数服务——日志量适中,数据安全优先 高频日志——追求吞吐量,可容忍极端情况丢少量日志
异常退出场景详解
退出方式 WriteSyncer BufferedWriteSyncer
Sync() 后正常退出 不丢 不丢(Sync 会 flush 缓冲区)
os.Exit(0) 未调 Sync() 不丢(已在内核缓冲区) 可能丢(用户态缓冲区未 flush)
kill -15(SIGTERM)+ 信号处理调 Sync() 不丢 不丢
kill -9(SIGKILL) 不丢(已在内核缓冲区) 丢失缓冲区中的数据
OOM Killer 不丢(已在内核缓冲区) 丢失缓冲区中的数据
panic 未 recover 不丢(已在内核缓冲区) 可能丢(取决于 panic 时是否执行了 defer Sync)
WriteSyncer(默认模式)

不需要额外配置,默认即为同步写入:

log := logger.MustNew(
    logger.WithPath("./logs/app"),
    logger.WithLevel("info"),
)
defer log.Sync()

优点:

  • 每条日志写入后立即进入内核缓冲区,数据安全性高
  • 进程崩溃、被 kill、OOM 等异常退出几乎不丢日志
  • 零额外内存开销
  • 行为直观,适合绝大多数业务场景

缺点:

  • 每条日志都触发系统调用(write syscall),高频写入时 I/O 开销大
  • 在日志量极大的服务中(如每秒万条以上)可能成为性能瓶颈
BufferedWriteSyncer(缓冲模式)

通过 WithBuffered(true) 启用,日志先写入内存缓冲区,当缓冲区满或达到刷写间隔时批量写入磁盘:

log := logger.MustNew(
    logger.WithPath("./logs/app"),
    logger.WithLevel("info"),
    logger.WithBuffered(true),                    // 启用缓冲
    logger.WithBufferSize(512*1024),              // 可选:缓冲区 512KB(默认 256KB)
    logger.WithFlushInterval(10*time.Second),     // 可选:每 10 秒刷写(默认 30 秒)
)
defer log.Sync() // 重要:确保退出时 flush 缓冲区

优点:

  • 批量写入大幅减少系统调用次数,高吞吐场景下性能提升显著(约 3-4 倍)
  • 适合日志量大的网关、数据管道、批处理等服务
  • 减少磁盘 I/O 竞争,对同机其他服务更友好

缺点:

  • 进程异常退出时(kill -9、OOM、panic 未 recover)可能丢失缓冲区中未 flush 的日志
  • 日志写入到实际落盘之间有延迟,tail -f 看日志会有滞后感
  • 额外占用缓冲区大小的内存(默认 256KB,每个文件 writer 独立分配)
  • 必须确保程序退出时调用 Sync() flush 残留数据
推荐:大多数场景使用默认的 WriteSyncer

推荐绝大多数服务使用默认的 WriteSyncer(不开启缓冲)。 理由:

  1. 日志的首要职责是可靠记录——丢失日志的代价通常远高于多几次系统调用的开销
  2. 大多数服务的日志量不会成为瓶颈——每秒几百到几千条日志,同步写入完全够用
  3. 排查线上问题时需要实时看日志——缓冲延迟会影响 tail -f 的实时性
  4. 减少心智负担——不需要担心异常退出丢日志,不需要确保每个退出路径都调了 Sync()

只在以下场景考虑开启 WithBuffered(true)

场景 说明
高吞吐网关 / 代理 每秒数万条日志,同步写入成为 CPU/IO 瓶颈
数据管道 / 批处理 大量日志密集写入,但任务结束时会正常 Sync()
非关键日志路径 如 access log、debug trace,丢少量可接受

以下场景必须使用默认的 WriteSyncer

场景 说明
金融交易 / 支付 每笔交易日志都是审计证据,不能丢
审计 / 合规 监管要求完整记录,丢失即违规
安全事件 入侵检测、权限变更等日志丢失会影响事后溯源
线上排障依赖实时日志 tail -f 需要即时看到输出

使用 Channel 的利弊

优点
  • 按业务分类查日志更快,例如 orderpaymentaudit
  • 某些高价值日志可以单独归档、单独采集。
  • 配置为双写时,既保留主日志全量视角,又能拿到独立分类文件。
  • WithNamed 的上下文会同时保留在默认日志和 channel 文件里。
代价
  • 双写会增加额外的编码和磁盘 I/O。
  • channel 越多,打开的文件句柄和 rotate 管理成本越高。
  • 如果把高基数维度当 channel,比如用户 ID、订单号、请求 ID,会迅速失控。
  • 如果你已经有 ELK、Loki、Datadog 之类的集中日志系统,很多场景下直接打结构化字段会更合适。

生产环境建议

  • 默认日志保留为全量日志,channel 只给少数稳定业务域使用。
  • 推荐的 channel 类别是低基数、长期稳定的分类,例如 orderpaymentauditsecurity
  • 不要把用户 ID、订单号、请求 ID、租户 ID 这类高基数值当作 channel。
  • I/O 比较敏感时,优先使用未配置 channel 或把 WithChannelDuplicateToDefault(false) 用在确实需要独立文件的分类上。
  • 如果项目后续会上集中日志平台,优先考虑“默认日志 + 结构化字段检索”,不要把 channel 文件拆分做成主路径。
  • 建议显式设置 WithPath("./logs/app"),避免直接使用默认 ./logs/ 前缀带来不够直观的文件命名。
  • 默认同步写日志,保证语义清晰;高吞吐场景可通过 WithBuffered(true) 启用缓冲写入提升性能,详见上方「写入模式」章节。

高性能使用建议

  • 对热点业务,优先把 orderLog := log.Channel("order") 这类 channel logger 初始化一次后复用。
  • 已配置 channel 的基础 logger 会在 New() / MustNew() 时预建;对已配置 channel,直接 log.Channel("order") 的热路径成本已经较低。
  • 如果链式叠加 Named(...)With(...)Channel(...),建议把最终派生出来的 logger 缓存复用,而不是每次请求都重新组合。
  • 尽量复用稳定的字段组合,不要在热路径里为大量高基数分类动态创建 channel。

基准测试

可用下面的命令在本地验证当前版本的热路径开销:

go test -run ^$ -bench "Benchmark(Info|Channel)" -benchmem

Documentation

Index

Constants

View Source
const Version = "v2.1.0"

Version 是当前库版本号。

Variables

This section is empty.

Functions

This section is empty.

Types

type ChannelOption

type ChannelOption func(*channelConfig) error

func WithChannelDuplicateToDefault

func WithChannelDuplicateToDefault(enabled bool) ChannelOption

func WithChannelPath

func WithChannelPath(path string) ChannelOption

type Config

type Config struct {
	// contains filtered or unexported fields
}

Config 是 v2 Logger 的内部配置容器。

字段全部不导出是有意为之——v2 采用 Functional Options 模式(New(opts ...Option)), Config 不应该被外部直接构造或反序列化(YAML/JSON 装配请通过 Option 函数)。

Config 类型本身暴露在 godoc 中是为了让 IDE / 文档工具能定位选项作用对象, 而非作为公开 API 接受用户构造的实例。

反模式(禁止):

cfg := &logger.Config{ ... } // ❌ 字段不导出,无法这样构造
_, _ = logger.New(cfg)        // ❌ New 不接受 Config,只接受 Option

正确用法:

l, err := logger.New(logger.WithPath("/var/log/app"), logger.WithOutJSON(true))

type ContextFieldsFunc

type ContextFieldsFunc func(ctx context.Context) []zap.Field

ContextFieldsFunc 从 context.Context 中提取需要注入日志的字段。 典型用法:提取 trace_id、request_id 等链路追踪信息。

type CronAdapter

type CronAdapter struct {
	// contains filtered or unexported fields
}

CronAdapter 适配 robfig/cron 的日志接口.

func NewCronAdapter

func NewCronAdapter(l *Logger) *CronAdapter

NewCronAdapter 创建 Cron 日志适配器。l 不能为 nil,否则 panic。

func (*CronAdapter) Error

func (a *CronAdapter) Error(err error, msg string, keysAndValues ...any)

Error implements cron.Logger.

func (*CronAdapter) Info

func (a *CronAdapter) Info(msg string, keysAndValues ...any)

Info implements cron.Logger.

type ESAdapter

type ESAdapter struct {
	// contains filtered or unexported fields
}

ESAdapter 适配 Elasticsearch client 的日志接口.

func NewESAdapter

func NewESAdapter(l *Logger) *ESAdapter

NewESAdapter 创建 ES 日志适配器。l 不能为 nil,否则 panic。

func (*ESAdapter) Printf

func (a *ESAdapter) Printf(format string, v ...any)

Printf implements estransport.Logger.

type Logger

type Logger struct {
	// contains filtered or unexported fields
}

func MustNew

func MustNew(opts ...Option) *Logger

func New

func New(opts ...Option) (*Logger, error)

func (*Logger) Channel

func (l *Logger) Channel(name string) *Logger

func (*Logger) DPanic

func (l *Logger) DPanic(msg string, fields ...zap.Field)

func (*Logger) DPanicf

func (l *Logger) DPanicf(format string, args ...any)

func (*Logger) Debug

func (l *Logger) Debug(msg string, fields ...zap.Field)

func (*Logger) DebugCtx

func (l *Logger) DebugCtx(ctx context.Context, msg string, fields ...zap.Field)

func (*Logger) Debugf

func (l *Logger) Debugf(format string, args ...any)

func (*Logger) Debugw

func (l *Logger) Debugw(msg string, keysAndValues ...any)

func (*Logger) DebugwCtx added in v2.1.0

func (l *Logger) DebugwCtx(ctx context.Context, msg string, keysAndValues ...any)

DebugwCtx 以 Debug 级别记录 Sugar 风格 key-value 日志,并自动合并 ContextFieldsFunc 从 ctx 提取的字段。

与 Debugw 的差别:在调用 zap Sugar 之前,会通过 ctxKeysAndValues 把 contextFields(ctx) 提取的 zap.Field 前置到 keysAndValues。未配置 WithContextFields 时,行为等价于 Debugw。

用法:

log.DebugwCtx(ctx, "cache miss", "key", "user:42", "tier", "L2")

func (*Logger) DroppedMessages

func (l *Logger) DroppedMessages() int64

DroppedMessages 返回异步 Messager 因队列满而丢弃的推送消息数量。 如果未配置 Messager,始终返回 0。

func (*Logger) Error

func (l *Logger) Error(msg string, fields ...zap.Field)

func (*Logger) ErrorCtx

func (l *Logger) ErrorCtx(ctx context.Context, msg string, fields ...zap.Field)

func (*Logger) Errorf

func (l *Logger) Errorf(format string, args ...any)

func (*Logger) Errorw

func (l *Logger) Errorw(msg string, keysAndValues ...any)

func (*Logger) ErrorwCtx added in v2.1.0

func (l *Logger) ErrorwCtx(ctx context.Context, msg string, keysAndValues ...any)

ErrorwCtx 以 Error 级别记录 Sugar 风格 key-value 日志,并自动合并 ctx 字段。 行为参见 DebugwCtx。

func (*Logger) Fatal

func (l *Logger) Fatal(msg string, fields ...zap.Field)

func (*Logger) Fatalf

func (l *Logger) Fatalf(format string, args ...any)

func (*Logger) GetLevel

func (l *Logger) GetLevel() string

GetLevel 返回当前日志级别字符串。

func (*Logger) HError

func (l *Logger) HError(msg string, fields ...zap.Field)

func (*Logger) HErrorTo

func (l *Logger) HErrorTo(url, msg string, fields ...zap.Field)

func (*Logger) HErrorTof

func (l *Logger) HErrorTof(url, format string, args ...any)

func (*Logger) HErrorf

func (l *Logger) HErrorf(format string, args ...any)

func (*Logger) HInfo

func (l *Logger) HInfo(msg string, fields ...zap.Field)

func (*Logger) HInfoTo

func (l *Logger) HInfoTo(url, msg string, fields ...zap.Field)

func (*Logger) HInfoTof

func (l *Logger) HInfoTof(url, format string, args ...any)

func (*Logger) HInfof

func (l *Logger) HInfof(format string, args ...any)

func (*Logger) Info

func (l *Logger) Info(msg string, fields ...zap.Field)

func (*Logger) InfoCtx

func (l *Logger) InfoCtx(ctx context.Context, msg string, fields ...zap.Field)

func (*Logger) Infof

func (l *Logger) Infof(format string, args ...any)

func (*Logger) Infow

func (l *Logger) Infow(msg string, keysAndValues ...any)

func (*Logger) InfowCtx added in v2.1.0

func (l *Logger) InfowCtx(ctx context.Context, msg string, keysAndValues ...any)

InfowCtx 以 Info 级别记录 Sugar 风格 key-value 日志,并自动合并 ctx 字段。 行为参见 DebugwCtx。

func (*Logger) LogIf

func (l *Logger) LogIf(err error)

func (*Logger) LogIfCtx added in v2.1.0

func (l *Logger) LogIfCtx(ctx context.Context, err error)

LogIfCtx 在 err != nil 时以 Error 级别记录日志,并合并 ctx 注入的字段。

func (*Logger) Named

func (l *Logger) Named(name string) *Logger

func (*Logger) Panic

func (l *Logger) Panic(msg string, fields ...zap.Field)

func (*Logger) Panicf

func (l *Logger) Panicf(format string, args ...any)

func (*Logger) SetLevel

func (l *Logger) SetLevel(level string)

SetLevel 运行时动态调整日志级别,影响所有 logger(包括 channel)。 支持: debug, info, warn, error, dpanic, panic, fatal.

func (*Logger) SlogHandler

func (l *Logger) SlogHandler() slog.Handler

SlogHandler 返回一个 slog.Handler,将 slog 日志写入当前 Logger 的 zap core。 用于统一第三方库的 slog 输出到同一个日志管道。

slog.SetDefault(slog.New(logger.SlogHandler()))

func (*Logger) Sugar

func (l *Logger) Sugar() *zap.SugaredLogger

func (*Logger) Sync

func (l *Logger) Sync()

func (*Logger) Undo

func (l *Logger) Undo()

func (*Logger) Warn

func (l *Logger) Warn(msg string, fields ...zap.Field)

func (*Logger) WarnCtx

func (l *Logger) WarnCtx(ctx context.Context, msg string, fields ...zap.Field)

func (*Logger) WarnIf added in v2.1.0

func (l *Logger) WarnIf(err error)

WarnIf 在 err != nil 时以 Warn 级别记录一条日志。

func (*Logger) WarnIfCtx added in v2.1.0

func (l *Logger) WarnIfCtx(ctx context.Context, err error)

WarnIfCtx 在 err != nil 时以 Warn 级别记录日志,并合并 ctx 注入的字段。

func (*Logger) Warnf

func (l *Logger) Warnf(format string, args ...any)

func (*Logger) Warnw

func (l *Logger) Warnw(msg string, keysAndValues ...any)

func (*Logger) WarnwCtx added in v2.1.0

func (l *Logger) WarnwCtx(ctx context.Context, msg string, keysAndValues ...any)

WarnwCtx 以 Warn 级别记录 Sugar 风格 key-value 日志,并自动合并 ctx 字段。 行为参见 DebugwCtx。

func (*Logger) With

func (l *Logger) With(fields ...zap.Field) *Logger

func (*Logger) Zap

func (l *Logger) Zap() *zap.Logger

type Messager

type Messager interface {
	// Send 发送消息到默认地址.
	Send(msg string)
	// SendTo 发送消息到指定 URL.
	SendTo(url, msg string)
}

Messager 消息推送接口. 实现此接口以将日志消息发送到外部平台(飞书/钉钉/企微等).

type MigrateAdapter

type MigrateAdapter struct {
	// contains filtered or unexported fields
}

MigrateAdapter 适配 gtkit/migrate/v2 的 migration.Logger 接口. 通过 SugaredLogger 的 key-value 方式输出结构化日志.

func NewMigrateAdapter

func NewMigrateAdapter(l *Logger) *MigrateAdapter

NewMigrateAdapter 创建 Migrate 日志适配器。l 不能为 nil,否则 panic。

func (*MigrateAdapter) Error

func (a *MigrateAdapter) Error(msg string, keysAndValues ...any)

Error implements migration.Logger.

func (*MigrateAdapter) Info

func (a *MigrateAdapter) Info(msg string, keysAndValues ...any)

Info implements migration.Logger.

func (*MigrateAdapter) Warn

func (a *MigrateAdapter) Warn(msg string, keysAndValues ...any)

Warn implements migration.Logger.

type Option

type Option func(*Config) error

func WithBufferSize

func WithBufferSize(size int) Option

WithBufferSize 设置缓冲区大小(字节),默认 256KB(256*1024)。 仅在 WithBuffered(true) 时生效。

func WithBuffered

func WithBuffered(enabled bool) Option

WithBuffered 启用文件写入缓冲(BufferedWriteSyncer)。 缓冲区大小默认 256KB,刷写间隔默认 30 秒。 启用后可显著减少系统调用次数,提升高吞吐场景下的写入性能, 但进程异常退出时可能丢失缓冲区中未刷写的日志。

func WithChannel

func WithChannel(name string, opts ...ChannelOption) Option

func WithCompress

func WithCompress(b bool) Option

func WithConsole

func WithConsole(b bool) Option

func WithContextFields

func WithContextFields(fn ContextFieldsFunc) Option

func WithDivision

func WithDivision(d string) Option

func WithDurationEncoder added in v2.0.5

func WithDurationEncoder(encoder zapcore.DurationEncoder) Option

func WithFile

func WithFile(b bool) Option

func WithFlushInterval

func WithFlushInterval(d time.Duration) Option

WithFlushInterval 设置缓冲区自动刷写间隔,默认 30 秒。 仅在 WithBuffered(true) 时生效。

func WithLevel

func WithLevel(l string) Option

func WithMaxAge

func WithMaxAge(days int) Option

func WithMaxBackups

func WithMaxBackups(n int) Option

func WithMaxSize

func WithMaxSize(mb int) Option

func WithMessager

func WithMessager(m Messager) Option

func WithMessagerQueueSize

func WithMessagerQueueSize(size int) Option

func WithOutJSON

func WithOutJSON(b bool) Option

func WithPath

func WithPath(p string) Option

type RestyAdapter

type RestyAdapter struct {
	// contains filtered or unexported fields
}

RestyAdapter 适配 go-resty 的日志接口.

func NewRestyAdapter

func NewRestyAdapter(l *Logger) *RestyAdapter

NewRestyAdapter 创建 Resty 日志适配器。l 不能为 nil,否则 panic。

func (*RestyAdapter) Debugf

func (a *RestyAdapter) Debugf(format string, v ...any)

Debugf implements resty.Logger.

func (*RestyAdapter) Errorf

func (a *RestyAdapter) Errorf(format string, v ...any)

Errorf implements resty.Logger.

func (*RestyAdapter) Warnf

func (a *RestyAdapter) Warnf(format string, v ...any)

Warnf implements resty.Logger.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL