logger

package
v0.19.4 Latest Latest
Warning

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

Go to latest
Published: Nov 1, 2026 License: Apache-2.0, Apache-2.0 Imports: 20 Imported by: 0

README

Go Logger - 企业级高性能日志库

go-toolbox/pkg/logger 是一个现代化、高性能的 Go 日志库,专为企业级应用设计。它提供结构化日志、基于 OpenTelemetry 的分布式追踪、敏感字段脱敏、单条体量上限、失败限频汇总、Console 风格日志等企业级能力;通过追加式编码、对象池、双缓冲异步写出、SWAR 扫描等优化,常规路径零堆分配。

stable license download release commit issues pull fork star go size contributors codecov Go Report Card Go Reference Sourcegraph

📚 文档导航

📖 官方文档
💬 社区支持

🚀 为什么选择 go-toolbox/pkg/logger?

⚡ 核心特性
  • 📊 结构化日志: 支持键值对、字段映射、对象自动解析、多行日志等多种结构化方式
  • 🔍 分布式追踪: 基于 OpenTelemetry 的链路追踪,trace_id 单一真相源,自动从 OTel span 提取
  • 🛡️ 开箱即用的脱敏: 凭据、支付、证件、PII 字段默认按字段名擦除或掩码,判定零分配
  • 📏 体量可控: 单条日志与单字段字节上限,超限按记录边界裁剪,JSON 始终合法
  • 📉 失败限频汇总: 持续故障时把 N 条重复错误压成个位数,保留发生与恢复时间点
  • 🎨 Console 风格: JavaScript Console 风格的分组、表格、计时器功能
  • 🔌 灵活扩展: 多种写入器适配器(Console、File、Rotate、Buffered、Multi)、自定义上下文提取器、格式化器、钩子、中间件
  • ⚡ 高性能: 默认输出走双缓冲异步管道;常规路径零堆分配,JSON + 5 字段约 108 ns/op(见 性能)
  • 🛡️ 并发安全: 完善的并发控制,适合高并发场景;-race 全量覆盖
  • 🎯 多输出格式: 支持 Text / JSON / XML / CSV 四种输出格式
核心功能
📝 多种日志方式
  • Printf 风格: Info(format, args...) / Infof(format, args...)
  • 纯文本: InfoMsg(msg) - 单个消息,无格式化开销
  • 键值对: InfoKV(msg, key, value, ...) - 结构化日志
  • 对象解析: InfoKV(msg, struct) - 单个结构体参数自动解析为键值对(优先取 json tag 作字段名)
  • 字段映射: InfoWithFields(msg, fields) - map 方式
  • 多行日志: InfoLines(line1, line2, ...) - 自动处理多行
  • 返回错误: InfoReturn(format, args...) - 记录日志并返回 error
  • 标准库兼容: Print / Printf / Println 兼容标准 log 包
🔍 分布式追踪
  • OpenTelemetry 单一真相源: trace_id 优先从 OTel span 提取(gRPC otelgrpc StatsHandler / HTTP Tracing 中间件创建 span)
  • 多来源 fallback: OTel span → ctx.Value → gRPC metadata
  • gRPC 链路传播: InjectTraceToOutgoing / ExtractTraceFromIncoming / RestoreTraceFromIncoming
  • 便捷辅助函数: ExtractTraceID / ContextWithTraceID
  • 自定义提取器: SetContextExtractor / WithContextExtractor / WithContextKeys
🛡️ 安全与合规
  • 字段名脱敏(默认开启): 凭据与会话、支付与金融、身份证件、收货地址、自然人姓名、设备标识、预签名链接整体擦除;手机号与邮箱掩码保留尾部便于对号
  • 零分配判定: 两级索引(形状位图 + 后缀字典树),未命中字段名 8.4 ns,不读值内容故不误伤业务正文
  • 运维字段豁免: status_code、error_code、grpc_code、ip_address、cache_key、partition_key、public_key 等排障主线索单列豁免表,优先于敏感后缀判定
  • 可选的值内容扫描: 升到 SanitizeKeysAndValues 后额外扫描 Bearer/Basic 凭据、三段式 JWT、邮箱、电话号码、带签名的私有链接、URL 内嵌账号密码、key=value 赋值;全手写单遍扫描,无正则
  • 自定义敏感字段: RegisterSensitiveKeys 按业务补充清单
  • 日志注入防护: text 模式转义控制字符,保证"一条日志恒为一行",用户可控字段无法伪造日志行
  • 单条体量上限: 默认 64KB,超限按记录边界回滚并补 truncated 标记;截断落在 UTF-8 字符边界
📍 可观测性
  • 服务身份字段: WithService / WithInstance / WithEnv 输出 service / instance / env,实例标识可从 INSTANCE_ID → POD_NAME → HOSTNAME 自动推导
  • 调用点定位: caller / callerfunc 字段,按 PC 缓存并预转义,内联感知(不会把行号报到调用行的下一行)
  • 失败限频汇总: FailureState / FailureLog 把持续故障的重复错误压成"首条 + 每间隔一条汇总 + 恢复一条",附 failure_count / suppressed_count / failure_duration_ms,间隔可指数退避
  • 着色自动判定: 按 NO_COLOR → TERM=dumb → 输出目标是否为字符设备决定,重定向到文件或管道时自动关闭
🎨 Console 风格日志
  • 日志分组: 支持嵌套分组和折叠分组(折叠时仅显示 ERROR/FATAL)
  • 表格渲染: 自动对齐、美化边框、智能列宽、东亚宽度计算
  • 计时器: 支持中间检查点(Log)、自动格式化(ns/μs/ms/s)、自动清理过期计时器
  • Context 集成: 分组内支持带上下文的日志(InfoContext 等)
  • 输出隔离: Console 展示内容直接写入 output,不走 logger 的 JSON/文本格式化,避免污染结构化日志流
🎯 多级日志系统
  • 26 种日志级别(按 6 个类别组织):
    • 基础级别(7个):TRACE(-1) → DEBUG(0) → INFO(1) → WARN(2) → ERROR(3) → FATAL(4) → OFF(99)
    • 系统级别(3个):SYSTEM(100) → KERNEL(101) → DRIVER(102)
    • 应用级别(4个):APPLICATION(103) → SERVICE(104) → COMPONENT(105) → MODULE(106)
    • 业务级别(4个):BUSINESS(200) → TRANSACTION(201) → WORKFLOW(202) → PROCESS(203)
    • 安全级别(4个):SECURITY(300) → AUDIT(301) → COMPLIANCE(302) → THREAT(303)
    • 性能级别(4个):PERFORMANCE(400) → METRIC(401) → BENCHMARK(402) → PROFILING(403)
  • 级别过滤: 动态调整日志级别(原子操作,运行时并发安全)
  • YAML/JSON 反序列化: LogLevel 实现 UnmarshalYAML / UnmarshalText / MarshalText,支持字符串与整数
  • 特殊日志类型: Success、Loading、Config、Start、Stop、Database、Network、Security、Cache、Environment
  • 性能日志: 自动分级(EXCELLENT/FAST/NORMAL/SLOW/VERY_SLOW)
  • 进度日志: 百分比和进度条显示
  • 健康检查: 服务健康状态监控
  • 审计日志: 用户操作审计追踪
企业级功能
  • 🔧 灵活配置: Builder 模式链式调用,支持运行时动态配置
  • ⚙️ 多种写入器: Console(异步双缓冲,并行写出零分配)、File、Rotate、Buffered、Multi,全部采用 Options 模式
  • ⚙️ 配置驱动创建: WriterConfig + CreateWriter 支持通过配置统一创建 Writer
  • 🎯 错误处理: 返回 error 的日志方法(*Return / *CtxReturn / *KVReturn),简化错误处理流程
  • 📊 统计分析: LoggerStats 内置日志统计,WriterStatsSnapshot 收集写入器运行时指标
  • 🧪 完善测试: 全面的测试覆盖与基准测试(logger_benchmark_test.go、writer_benchmark_test.go、writer_console_async_test.go 等)
  • 🔌 接口丰富: 定义 ILogger / IWriter / IAdapter / IManager / IFormatter / IHook / IMiddleware 等接口,并兼容 Zap/Logrus/slog/Zerolog 框架接口

⚠️ 重要默认值

NewLogger() 的几个默认值会直接影响线上行为,接入前请先过一遍:

默认值 行为 需要注意什么
输出 = 共享 stdout 异步管道 日志写入双缓冲后由后台 goroutine 合并写出 优雅退出必须调 logger.Flush(),否则最坏丢失最近 100ms 的日志
格式 = FormatJSON 结构化输出 需要人读格式用 WithFormat(logger.FormatText)
级别 = DEBUG 全部放行 生产建议 WithLevel(logger.INFO)
showCaller = true 输出 caller / callerfunc 每条约 +117 ns(成本是 runtime.Callers 栈回溯本身),不需要可关
脱敏 = SanitizeKeys 按字段名擦除凭据、掩码 PII 若字段名碰巧命中规则而内容并不敏感,用 WithSanitize(logger.SanitizeOff) 或改字段名
行长上限 = 64KB 超限裁剪并补 truncated 需要完整落盘超大字段时 WithMaxLineBytes(0) 关闭
单字段上限 = 关闭 不限制 按业务需要 WithMaxFieldBytes(n)
着色 = 自动判定 终端开、重定向关 WithColorful(bool) 显式指定后不再自动判定
为什么默认输出是异步的

裸 os.Stdout 没有缓冲,每条日志一次 write(2) 加一次互斥。实测(Apple M4,JSON + 2 对 KV、关 caller):

输出配置 串行 并行(10)
io.Discard(纯格式化成本) 68 ns 20 ns
裸 *os.File → /dev/null 429 ns 674 ns
裸 *os.File → 真实文件 1239 ns —
共享异步管道(默认) 125 ns 215 ns

格式化只占 68 ns,而裸标准流要再付 3601170 ns 的 syscall 与锁竞争——全链路 8597% 的成本都在写出路径。所以默认值选异步,代价是需要在退出链路刷盘:

func main() {
 defer logger.Flush() // 刷净已入缓冲但未落盘的条目

 log := logger.NewLogger().WithLevel(logger.INFO)
 log.Info("应用启动")
 // ...
}

FATAL 路径由库在 os.Exit 前强制刷盘,遗言不会丢。kill -9 无法挽救(异步语义固有权衡)。

需要逐条立即落盘(调试、与其他进程输出严格交错)时显式退回裸流——WithOutput 原样使用传入的 writer,不做任何包装:

log := logger.NewLogger().WithOutput(os.Stdout) // 同步直写,无需 Flush

🏗️ 项目结构

go-toolbox/pkg/logger/
├── logger.go                  # 核心日志实现(基础/结构化/上下文/特殊/性能日志、caller 定位、JSON 编码)
├── fields.go                  # 子 Logger 的预编码字段存储与写出路径(WithField/WithFields)
├── types.go                   # 核心类型定义与 Builder 方法、全局 Logger
├── interfaces.go              # 接口定义(ILogger 及框架兼容接口)
├── level.go                   # 日志级别管理(26 种级别,6 个类别)
├── context.go                 # 上下文服务(OTel 链路追踪提取)
├── sanitize.go                # 敏感字段脱敏(规则表 + 两级索引判定)
├── scan.go                    # 值内容扫描(可选开启,手写单遍扫描)
├── limit.go                   # 单条日志与单字段字节上限、超限裁剪
├── escape.go                  # 文本模式控制字符转义(防日志注入,SWAR)
├── identity.go                # 服务身份固定字段(service/instance/env)
├── failure.go                 # 持续失败的限频汇总(FailureState/FailureLog)
├── time.go                    # 时间戳快速路径(RFC3339Nano 秒级前缀缓存)
├── value.go                   # 值格式化与显示宽度工具(零外部依赖)
├── tty.go                     # 输出目标的着色能力探测(NO_COLOR / 字符设备)
├── console.go                 # Console 风格日志(分组/表格)
├── timer.go                   # 计时器实现(含自动清理)
├── writer.go                  # 写入器实现(Console 异步双缓冲 / File / Rotate / Buffered / Multi)
├── stdout.go                  # 进程级共享的标准流异步输出器(默认输出)+ 包级 Flush/Close
├── output.go                  # 输出类型与配置(WriterConfig + CreateWriter)
├── empty.go                   # 空实现(EmptyLogger/EmptyAdapter/EmptyWriter/EmptyHook)
├── *_test.go                  # 测试文件(含 caller_shape_test.go 逐入口校验行号定位)
├── logger_benchmark_test.go   # 日志与 caller 定位基准测试
├── sanitize_benchmark_test.go # 脱敏判定与值扫描基准测试
├── limit_benchmark_test.go    # 字节上限基准测试
├── writer_benchmark_test.go   # 写入器基准测试
└── benchmark.sh               # 基准测试脚本

跨库性能对比(go-toolbox/pkg/logger / zap / zerolog / slog)在独立仓库 go-logger-benchmark 维护。

📦 快速开始

环境要求

需要 Go 版本 1.25.0 或更高版本

安装

使用 Go 的模块支持,当您在代码中添加导入时,go [build|run|test] 将自动获取所需的依赖项:

import "github.com/HitGameAI/apex-toolbox/pkg/logger"

或者,使用 go get 命令:

go get -u github.com/HitGameAI/apex-toolbox/pkg/logger

🚀 使用示例

基础用法
package main

import (
 "context"
 "github.com/HitGameAI/apex-toolbox/pkg/logger"
)

func main() {
 // 创建日志实例
 log := logger.NewLogger()

 // 基础日志(Printf 风格)
 log.Info("应用启动")
 log.Debug("调试信息: %s", "debug message")
 log.Warn("警告信息")
 log.Error("错误信息")

 // 结构化日志 - 键值对方式
 log.InfoKV("用户登录", "user_id", 1001, "username", "张三")

 // 🎯 结构化日志 - 对象方式 (自动解析)
 type User struct {
  ID    int    `json:"id"`
  Name  string `json:"name"`
  Email string `json:"email"`
 }
 user := User{ID: 1001, Name: "张三", Email: "user@example.com"}

 // 直接传递单个对象,自动解析为键值对
 log.InfoKV("用户信息", user)
 // 输出: 用户信息 {id: 1001, name: 张三, email: user@example.com}

 // 也支持 map
 data := map[string]interface{}{
  "request_id": "req-123",
  "method":     "POST",
  "status":     200,
 }
 log.InfoKV("API 请求", data)

 // 字段映射方式
 log.InfoWithFields("订单创建", map[string]interface{}{
  "order_id": "ORD-12345",
  "amount":   99.99,
  "user_id":  1001,
 })

 // 🎯 带上下文的日志(基于 OTel 链路追踪)
 ctx := logger.ContextWithTraceID(context.Background(), "trace-12345")
 log.InfoContext(ctx, "用户登录成功")
 // 输出: [trace_id=trace-12345] 用户登录成功

 // 链式调用添加字段
 log.WithField("trace_id", "trace-123").
  WithField("user_id", "user-456").
  Info("带字段的日志")

 // 🎨 Console 风格日志
 cg := log.NewConsoleGroup()

 // 📊 分组日志
 cg.Group("🚀 应用启动流程")
 cg.Info("开始初始化...")

 // 📋 表格展示
 config := map[string]interface{}{
  "环境":   "生产环境",
  "端口":   8080,
  "调试模式": false,
 }
 cg.Table(config)

 // ⏱️  计时器
 timer := cg.Time("数据库连接")
 // ... 执行数据库连接 ...
 timer.End() // 输出: ⏱️  数据库连接: 123.45ms

 cg.Info("✅ 启动完成")
 cg.GroupEnd()
}
链式配置
// Builder 模式链式调用
log := logger.NewLogger().
 WithLevel(logger.INFO).
 WithShowCaller(true).
 WithPrefix("[MyApp]").
 WithFormat(logger.FormatJSON). // 支持 FormatText/FormatJSON/FormatXML/FormatCSV
 WithService("order-svc").      // 身份字段,预编码一次
 WithEnv("prod").
 WithMaxLineBytes(64 * 1024) // 单条上限,0 表示不限制

log.Info("配置完成")

没有显式调用 WithColorful 时,着色随输出目标自动判定(终端开、重定向关)。 显式调用后始终尊重调用方的选择。

🛡️ 敏感字段脱敏

默认按字段名脱敏,不读值内容——既不误伤业务正文,成本也不随消息长度增长:

log.InfoKV("order created",
 "order_id", "ORD-20260126-001",      // 业务主键,保留
 "receiver_name", "张三",              // 自然人姓名,整体擦除
 "receiver_phone", "13800138000",     // 号码掩码,保留末 4 位
 "customer_email", "alice@example.com",
 "access_token", "at_live_9f8e7d6c",  // 凭据,整体擦除
 "status_code", 200)                  // 排障线索,保留
{"timestamp":"...","level":"INFO","message":"order created","order_id":"ORD-20260126-001","receiver_name":"[REDACTED]","receiver_phone":"***8000","customer_email":"a***@example.com","access_token":"[REDACTED]","status_code":200}

字段名的大小写与分隔符变体一视同仁:accessToken、ACCESS-TOKEN、X-Api-Key 都会命中;后缀规则覆盖任意前缀,wx_app_secret、user_password、cdn_signed_url 同样生效。

// 调整强度
log.WithSanitize(logger.SanitizeOff)             // 关闭
log.WithSanitize(logger.SanitizeKeys)            // 仅按字段名(默认)
log.WithSanitize(logger.SanitizeKeysAndValues)   // 额外扫描 msg 与值的内容

// 按业务补充敏感字段名(全进程生效,应在启动阶段调用完毕)
logger.RegisterSensitiveKeys("my_voucher_code", "internal_ticket")

值扫描模式会额外处理正文里漏出的凭据与 PII:

vlog := log.WithSanitize(logger.SanitizeKeysAndValues)
vlog.InfoMsg("retry with Bearer eyJhbGciOiJIUzI1NiJ9 failed")
// → "retry with Bearer [REDACTED] failed"
vlog.InfoKV("cb", "note", "callback https://cdn.x.com/f?signature=abc to alice@example.com")
// → "callback [REDACTED] to a***@example.com"

值扫描要逐条扫文本,且业务正文可能被误伤(如长订单号被当成号码),故不作为默认值。 预过滤判据刻意收紧:trace_id、unix 时间戳、UUID 这类运维标识不会触发扫描。

📏 单条体量上限
log := logger.NewLogger().
 WithMaxLineBytes(200).      // 整行上限
 WithMaxFieldBytes(2048)     // 单字段上限(默认不限制)

log.InfoKV("dump", "head", "keep-me", "payload", strings.Repeat("x", 500))
{"timestamp":"...","level":"INFO","message":"dump","head":"keep-me","truncated":true}

裁剪规则:骨架(时间戳、级别、消息、caller)最先写出故最后被牺牲;字段按调用方给出的 顺序写出,先写的字段先保住——把根因与身份字段写在前面、大块 payload 写在后面即可。 回滚一律落在完整字段的边界上,JSON 始终合法。

📉 持续失败的限频汇总

下游不可用时重试循环会打出完全相同的错误日志。一个 50ms 重试间隔的连接十分钟内就是 12000 条同样的行,而它们携带的信息量和 1 条没有区别:

fl := logger.NewFailureLog(log, logger.FailureLogConfig{
 Interval:    time.Minute,      // 汇总间隔
 MaxInterval: 10 * time.Minute, // 配置后间隔逐次翻倍,用于长时间卡死的依赖
})

for {
 if err := dial(); err != nil {
  // 首条立即出,之后每间隔一条带累计次数的汇总
  fl.Fail(ctx, "upstream:dial", logger.ERROR, "dial upstream failed", "addr", addr)
  time.Sleep(backoff(fl.Count("upstream:dial")))
  continue
 }
 // 存在未恢复的失败时输出一条 INFO 并清除状态
 fl.Recover(ctx, "upstream:dial", "upstream recovered")
 break
}

5000 次失败只输出 2 条(首条 + 恢复),汇总字段带上被压制的次数:

{"level":"ERROR","message":"dial upstream failed","addr":"10.0.0.1:5432","failure_count":1,"suppressed_count":0,"failure_duration_ms":0}
{"level":"INFO","message":"upstream recovered","failure_count":5000,"suppressed_count":4999,"failure_duration_ms":0}

长时间没有新失败的键会被摊销清理且不输出恢复日志,内存只随"正在失败的键数"增长。

📍 服务身份字段
log := logger.NewLogger().
 WithService("order-svc").
 WithInstance("").          // 传空串则按 INSTANCE_ID → POD_NAME → HOSTNAME → 主机名推导
 WithEnv("prod")

log.InfoKV("started", "port", 8080)
{"timestamp":"...","level":"INFO","service":"order-svc","instance":"order-svc-7d9f-abcde","env":"prod","message":"started","port":8080}

三个字段在设置时预编码成片段,每条日志只做一次 memcpy,常驻字段不带来逐条编码成本。 身份字段紧随 level 输出,位置固定便于下游按列解析。

🔗 子 Logger(常驻字段)
reqLog := log.WithField("request_id", "rq_0f8e7d6c").WithField("org_id", "o_1001")
reqLog.InfoMsg("handling request")
reqLog.InfoKV("done", "status", 200)
{"timestamp":"...","level":"INFO","message":"handling request","request_id":"rq_0f8e7d6c","org_id":"o_1001"}
{"timestamp":"...","level":"INFO","message":"done","request_id":"rq_0f8e7d6c","org_id":"o_1001","status":200}

字段在 WithField 时一次性预编码,之后每条日志只做一次 memcpy——稳态成本与字段数无关 (2 / 4 / 8 个常驻字段均约 100 ns)。字段按键排序,同一个子 Logger 的输出顺序稳定可比对; 同名键覆盖原位而非产生重复键。优先级为 单条 KV > 子 Logger 固定字段 > ctx 提取字段。

分布式追踪(OpenTelemetry 集成)

trace_id 的单一真相源是 OTel span。当 gRPC(otelgrpc StatsHandler)或 HTTP(Tracing 中间件)创建 span 后,日志会自动从 span 提取 trace_id,无需手动注入。

// 1. 便捷方式:手动注入 trace_id(OTel 未启用时的 fallback)
ctx := logger.ContextWithTraceID(context.Background(), "trace-12345")
log.InfoContext(ctx, "带 trace 的日志")

// 2. 提取 trace_id
traceID := logger.ExtractTraceID(ctx)

// 3. gRPC 跨节点传播
// 客户端:注入到 outgoing metadata
outCtx := logger.InjectTraceToOutgoing(ctx, traceID)
// 服务端:从 incoming metadata 恢复到 ctx
restoredCtx := logger.RestoreTraceFromIncoming(incomingCtx)

// 4. 配置自定义上下文 key(除 trace_id 外额外提取)
log.WithContextKeys("request_id", "user_id")
// 此后 InfoContextKV 等方法会同时提取 trace_id(OTel)和这些 key
自定义上下文提取器
// 自定义提取器,完全控制上下文信息输出
extractor := func(ctx context.Context) string {
 if ctx == nil {
  return ""
 }
 var parts []string
 if traceID, ok := ctx.Value("trace_id").(string); ok {
  parts = append(parts, "TraceID="+traceID)
 }
 if userID, ok := ctx.Value("user_id").(string); ok {
  parts = append(parts, "UserID="+userID)
 }
 if len(parts) > 0 {
  return "[" + strings.Join(parts, " ") + "] "
 }
 return ""
}

log.SetContextExtractor(extractor)
// 或 Builder 模式:log.WithContextExtractor(extractor)

ctx := context.WithValue(context.Background(), "trace_id", "trace-123")
ctx = context.WithValue(ctx, "user_id", "user-456")
log.InfoContext(ctx, "自定义上下文")
// 输出: [TraceID=trace-123 UserID=user-456] 自定义上下文
🎨 Console 风格日志功能

类似 JavaScript console 的日志分组、表格和计时器功能,让日志输出更加结构化和易读。

log := logger.NewLogger()
cg := log.NewConsoleGroup()

// 📊 日志分组 - 组织相关日志
cg.Group("🌐 API 请求处理")
cg.Info("接收到请求: GET /api/users")

// 嵌套分组
cg.Group("参数验证")
cg.Info("验证通过")
cg.GroupEnd()

// 📋 表格展示 - 结构化数据可视化
users := []map[string]interface{}{
 {"ID": 1, "姓名": "张三", "年龄": 25, "状态": "Active"},
 {"ID": 2, "姓名": "李四", "年龄": 30, "状态": "Active"},
}
cg.Table(users)
// 输出美观的表格(自动处理中文字符宽度对齐)

// ⏱️  性能计时 - 测量操作耗时
timer := cg.Time("数据库查询")
// ... 执行数据库操作 ...
timer.End()  // 输出: ⏱️  数据库查询: 123.45ms

// 中间检查点
timer2 := cg.Time("文件处理")
// ... 执行部分操作 ...
timer2.Log("处理 50%")  // 输出: ⏱️  文件处理: 50.12ms - 处理 50%
// ... 继续操作 ...
timer2.End()  // 输出: ⏱️  文件处理: 102.34ms

cg.Info("✅ 请求处理完成")
cg.GroupEnd()

// 🎯 折叠分组 - 隐藏详细日志(仅显示 ERROR/FATAL)
cg.GroupCollapsed("调试信息")
cg.Debug("这条不会显示")
cg.Info("这条也不会显示")
cg.Error("但错误日志会显示")  // ❌ 会显示
cg.GroupEnd()

说明:包级便捷函数(如 logger.Group() / logger.Info() / logger.Table())未提供。如需全局使用,请通过 logger.GetGlobalLogger() 获取默认 Logger,或用 logger.New()(NewLogger 的简写)创建实例。

主要特性:

  • 🎯 日志分组:

    • Group(label, ...args) - 开始新分组
    • GroupCollapsed(label, ...args) - 开始折叠分组(仅显示 ERROR/FATAL)
    • GroupEnd() - 结束当前分组
    • 支持无限层级嵌套,自动缩进
  • 📊 表格渲染:

    • Table(data) - 智能表格渲染
    • 支持格式: []map[string]interface{}, map[string]interface{}, [][]string, []string
    • 自动对齐、美化边框、智能列宽、东亚宽度对齐
  • ⏱️ 计时器:

    • Time(label) - 开始计时,返回 *Timer
    • Timer.End() - 结束计时并输出总耗时
    • Timer.Log(message) - 输出中间检查点
    • Timer.Elapsed() - 获取已过时间(不输出)
    • 智能时间格式化 (ns/μs/ms/s)
    • 自动清理过期计时器(SetTimerMaxAge / SetTimerCleanupInterval 可调)
  • 🔄 Context 集成:

    • InfoContext(ctx, ...) / DebugContext(ctx, ...) / WarnContext(ctx, ...) / ErrorContext(ctx, ...)
    • 在分组内使用,自动继承缩进

适用场景:

  • 🚀 应用启动流程展示
  • 📊 批量数据处理进度
  • 🔍 复杂业务流程追踪
  • ⚡ 性能瓶颈分析
  • 🐛 调试信息结构化输出
特殊日志类型
log := logger.NewLogger()

// 成功日志
log.Success("用户注册成功")

// 加载日志
log.Loading("正在加载配置文件...")

// 配置日志
log.ConfigLog("数据库连接: %s", "localhost:3306")

// 启动/停止日志
log.Start("HTTP 服务器启动在端口 8080")
log.Stop("HTTP 服务器已停止")

// 数据库日志
log.Database("执行查询: SELECT * FROM users")

// 网络日志
log.Network("发送 HTTP 请求: GET /api/users")

// 安全日志(SECURITY 级别)
log.Security("检测到可疑登录尝试")

// 缓存日志
log.Cache("缓存命中: user:1001")

// 环境日志
log.Environment("当前环境: production")

// 性能日志(自动分级)
log.Performance("数据库查询", 50*time.Millisecond)
// 输出: ⚡ [PERF-EXCELLENT] 数据库查询 completed in 50ms

log.Performance("API 调用", 2*time.Second, map[string]any{
 "endpoint": "/api/users",
 "method":   "GET",
})
// 输出: 🐢 [PERF-SLOW] API 调用 completed in 2s | Details: map[endpoint:/api/users method:GET]

// 进度日志
log.Progress(50, 100, "数据导入")
// 输出: 🟡 [PROGRESS] 数据导入: 50/100 (50.0%)

// 里程碑日志
log.Milestone("系统初始化完成")
// 输出: 🎯 [MILESTONE] 系统初始化完成

// 健康检查日志
log.Health("数据库", true, "连接正常")
// 输出: ✅ [HEALTH] 数据库: HEALTHY | 连接正常

log.Health("Redis", false, "连接超时")
// 输出: ❌ [HEALTH] Redis: UNHEALTHY | 连接超时

// 审计日志(AUDIT 级别)
log.Audit("删除用户", "admin", "user:1001", "成功")
// 输出: 📋 [AUDIT] User: admin | Action: 删除用户 | Resource: user:1001 | Result: 成功

// 带上下文的特殊日志(自定义类型与级别)
log.LogSpecialContext(ctx, logger.SuccessType, logger.INFO, "操作成功")
log.LogSpecialContext(ctx, logger.DatabaseType, logger.INFO, "查询 %s 耗时 %v", table, duration)
log.LogSpecialContext(ctx, logger.SecurityType, logger.SECURITY, "检测到异常访问 %s", ip)
计时器辅助
log := logger.NewLogger()

// 开始计时
timing := log.StartTiming("数据处理")

// 添加详细信息(链式)
timing.AddDetail("records", 1000).
 AddDetail("source", "database")

// 结束计时并自动记录性能日志
timing.End()
// 输出: ⚡ [PERF-FAST] 数据处理 completed in 80ms | Details: map[records:1000 source:database]
返回错误的日志方法
func processUser(id int) error {
 user, err := findUser(id)
 if err != nil {
  // 记录错误日志并返回错误
  return log.ErrorReturn("查找用户失败: %v", err)
 }

 if user == nil {
  // 记录警告日志并返回错误
  return log.WarnReturn("用户不存在: %d", id)
 }

 return nil
}

// 带上下文的返回错误
func processOrder(ctx context.Context, orderID string) error {
 order, err := findOrder(orderID)
 if err != nil {
  return log.ErrorCtxReturn(ctx, "查找订单失败: %v", err)
 }

 return nil
}

// 键值对方式返回错误
func validateInput(data map[string]interface{}) error {
 if data["email"] == nil {
  return log.WarnKVReturn("缺少必填字段", "field", "email")
 }

 return nil
}
多输出写入器(Options 模式)

所有写入器均采用 Options 函数式选项模式构造:

// 控制台写入器(异步双缓冲:生产者只做一次 memcpy,后台 goroutine 在锁外合并写出)
consoleWriter := logger.NewConsoleWriter(
 logger.WithConsoleOutput(os.Stdout),
 logger.WithConsoleColor(true),
 logger.WithConsoleBatchBytes(64*1024),             // 活动缓冲达到此体量即唤醒后台写出
 logger.WithConsoleQueueSize(512*1024),             // 待写缓冲硬上限(字节),超过即同步直写形成背压
 logger.WithConsoleFlushInterval(100*time.Millisecond), // 定时刷写间隔
)
defer consoleWriter.Close() // 刷净缓冲并停止后台 goroutine

// 文件写入器
fileWriter := logger.NewFileWriter(
 logger.WithFileWriterPath("app.log"),
 logger.WithFilePermission(0644),
 logger.WithFileBufferSize(4096),
)

// 轮转文件写入器(按大小/数量/时间轮转,支持压缩)
rotateWriter := logger.NewRotateWriter(
 logger.WithFilePath("app.log"),
 logger.WithMaxSize(100*1024*1024), // 100MB
 logger.WithMaxFiles(10),          // 保留 10 个文件
 logger.WithMaxAge(30*24*time.Hour),
 logger.WithCompress(true),
)

// 缓冲写入器(在底层 writer 之上做缓冲)
bufferedWriter := logger.NewBufferedWriter(
 logger.WithBufferedUnderlying(fileWriter),
 logger.WithBufferSize(64*1024),
)

// 多输出写入器(同时分发到多个 writer)
multiWriter := logger.NewMultiWriter(
 logger.WithWriters(consoleWriter, fileWriter, rotateWriter),
)

// 创建日志实例
log := logger.NewLogger().WithOutput(multiWriter)
log.Info("这条日志会同时输出到控制台和文件")

通过配置统一创建 Writer(适合配置驱动的场景):

config := &logger.WriterConfig{
 Type:     logger.OutputRotate,
 FilePath: "app.log",
 MaxSize:  100 * 1024 * 1024,
 MaxFiles: 10,
 Compress: true,
}
writer, err := logger.CreateWriter(config)
log := logger.NewLogger().WithOutput(writer)
空实现(禁用日志)
// 创建空日志实例(不输出任何日志)
emptyLog := logger.NewEmptyLogger()

// 所有日志方法都不会产生任何输出
emptyLog.Info("这条日志不会输出")
emptyLog.Error("这条错误也不会输出")

// 带级别的空日志
emptyLogWithLevel := logger.NewEmptyLoggerWithLevel(logger.ERROR)

// 其他空实现
adapter := logger.NewEmptyAdapter("noop")
writer := logger.NewEmptyWriter()
hook := logger.NewEmptyHook([]logger.LogLevel{logger.ERROR})

// 判断是否为空日志 / 包装为空日志
logger.IsEmptyLogger(emptyLog)
logger.WrapWithEmpty(originalLogger)

// 适用场景:测试环境、性能敏感场景、占位实现
全局 Logger
// 获取默认全局 Logger(包 init 时创建)
glog := logger.GetGlobalLogger()
glog.Info("全局日志")

// 全局设置
logger.SetGlobalLevel(logger.WARN)
logger.SetGlobalShowCaller(false)

📋 API 速览

ILogger 接口方法(按类别)
类别 方法
基础(Printf) Debug Info Warn Error Fatal Debugf Infof Warnf Errorf Fatalf
纯文本 DebugMsg InfoMsg WarnMsg ErrorMsg FatalMsg
结构化 KV DebugKV InfoKV WarnKV ErrorKV FatalKV
字段映射 DebugWithFields InfoWithFields WarnWithFields ErrorWithFields FatalWithFields
多行 InfoLines ErrorLines WarnLines DebugLines
上下文 DebugContext InfoContext WarnContext ErrorContext FatalContext
上下文 KV DebugContextKV InfoContextKV WarnContextKV ErrorContextKV FatalContextKV
上下文多行 DebugContextLines InfoContextLines WarnContextLines ErrorContextLines
返回错误 DebugReturn InfoReturn WarnReturn ErrorReturn
返回错误(ctx) DebugCtxReturn InfoCtxReturn WarnCtxReturn ErrorCtxReturn
返回错误(KV) DebugKVReturn InfoKVReturn WarnKVReturn ErrorKVReturn
原始条目 Log LogContext LogKV LogWithFields LogSpecialContext
链式构建 WithField WithFields WithError WithContext
标准库兼容 Print Printf Println
Console NewConsoleGroup ConsoleGroup ConsoleGroupCollapsed ConsoleGroupEnd ConsoleTable ConsoleTime
配置 SetLevel GetLevel SetShowCaller IsShowCaller IsLevelEnabled
Logger Builder 方法
类别 方法
基础 WithLevel WithShowCaller WithPrefix WithColorful WithOutput WithTimeFormat WithFormat WithCallerDepth WithShowStacktrace
字段名 WithTimestampKey WithLevelKey WithMessageKey WithCallerKey WithStacktraceKey
安全与体量 WithSanitize WithMaxLineBytes WithMaxFieldBytes
服务身份 WithService WithInstance WithEnv
上下文 WithContextExtractor WithContextKeys
扩展 WithFormatter WithWriters WithHooks WithMiddleware
包级函数
类别 函数
构造 NewLogger New GetGlobalLogger NewEmptyLogger NewEmptyLoggerWithLevel
刷盘与关闭 Flush Close(共享标准流输出器;优雅退出链路必调 Flush)
共享输出器 DefaultOutput StderrOutput
写入器 NewConsoleWriter NewFileWriter NewRotateWriter NewBufferedWriter NewMultiWriter CreateWriter
全局配置 SetGlobalLevel SetGlobalShowCaller
脱敏 RegisterSensitiveKeys
身份 DetectInstance
失败汇总 NewFailureLog
链路追踪 ExtractTraceID ContextWithTraceID InjectTraceToOutgoing ExtractTraceFromIncoming RestoreTraceFromIncoming
级别 ParseLevel GetAllLevels GetBasicLevels GetExtendedLevels GetLevelsByCategory GetLevelNames GetAllCategories
计时器 NewTimer NewConsoleGroup SetTimerMaxAge SetTimerCleanupInterval CleanupExpiredTimers GetActiveTimersCount
关键常量与类型
名称 说明
SanitizeOff / SanitizeKeys / SanitizeKeysAndValues 脱敏强度,默认 SanitizeKeys
DefaultMaxLineBytes 单条日志默认字节上限(64KB)
FormatText / FormatJSON / FormatXML / FormatCSV 输出格式
FieldService / FieldInstance / FieldEnv 身份字段名
FieldFailureCount / FieldSuppressedCount / FieldFailureDurationMS 失败汇总字段名
FailureState / FailureLog / FailureLogConfig 失败限频汇总
DefaultFailureInterval 汇总间隔默认值(1 分钟)

📊 性能

实测环境:Apple M4 / Go 1.26.2 / -cpu=10。格式化类数据输出到 io.Discard, 脱敏与行长上限关闭(这两项是 zap / zerolog / slog 都不具备的能力,开着就不是同工作量比较)。

格式化路径
场景 ns/op allocs/op
级别短路(WARN 阈值下打 Debug) 2 0
纯消息 59 0
JSON + 5 对 KV 108 0
JSON + 5 对 KV + caller 229 0
子 Logger 稳态(2 / 4 / 8 个常驻字段) 约 100 0
子 Logger 构造 1 字段 + 打一条 141 1
能力开启的代价
能力 代价
脱敏 SanitizeKeys 约 +10 ns/字段(字段名判定 8.4 ns,零分配)
行长上限 约 +7 ns/条
服务身份字段 约 0(预编码片段,一次 memcpy)
caller 定位 约 +117 ns(成本是 runtime.Callers 栈回溯本身,与帧数线性相关)

行长上限在失控大字段上的收益明显——200KB payload:关闭 26861 ns/op、217224 B/op, 开启 8943 ns/op、69722 B/op。

输出路径
输出配置 串行 并行(10)
ConsoleWriter(异步双缓冲,默认) 24 ns 110 ns
裸 *os.File 429 ns 674 ns
跨库对比

四库对比(含输出目标、子 Logger、类型化值、text 格式、大字段等 17 个场景)在 go-logger-benchmark 维护并由 CI 自动生成。

一个值得强调的结论:io.Discard 基线只能测出格式化成本,而生产里 8597% 的单条成本 在写出路径上。实测直写真实文件时四库差距从 io.Discard 下的 35 倍收敛到 1.4 倍以内 ——只看 io.Discard 的数字去选库或调优,会把全部精力投在不到 15% 的那段上。

本地复现
go test -run='^$' -bench='.' -benchtime=2s -count=3 -cpu=10 .

单次 -benchtime=1s 在大 suite 里有 ±25% 噪声,判断回归请用 -count=3。

🤝 社区贡献

我们欢迎各种形式的贡献!请遵循以下指南:

提交代码
  • Fork 项目
git clone https://github.com/HitGameAI/apex-toolbox/tree/master/pkg/logger.git
cd go-toolbox/pkg/logger
  • 创建特性分支
git checkout -b feature/your-amazing-feature
  • 编写代码和测试

  • 确保新功能有完整的测试套件

  • 运行 go test ./... 确保所有测试通过

  • 保持代码覆盖率 > 90%

  • 提交更改

git commit -m 'feat: add amazing new feature'
  • 推送并创建 Pull Request
git push origin feature/your-amazing-feature
代码规范
  • 遵循 Go 官方代码风格
  • 使用有意义的函数和变量名
  • 添加必要的注释和文档
  • 使用测试套件编写测试
  • 确保并发安全
测试要求
  • 新功能必须有对应的测试套件
  • 测试覆盖率不得低于当前水平
  • 包含性能基准测试(如适用,可参考 benchmark.sh)
  • 并发相关改动必须跑 go test -race ./...

有几类改动的失败是静默的(输出看起来正常、不报任何错),对应的回归测试请一并补上:

改动类型 必须验证
调用链上下结构(影响 caller 定位) go test -run='TestCallerShape' -v —— 逐个公开入口校验上报的行号。栈回溯窗口若装不下用户帧会静默退化到全量回退,成本翻倍而输出仍然正确
任何截断 / 裁剪路径 多个不同上限下输出仍是合法 JSON;truncated 标记存在;多字节字符不被切断
脱敏规则表 双向断言——凭据确实被擦除,且运维字段(status_code / ip_address / cache_key / trace_id)确实保留。过度脱敏不报错,只是让日志失去排障价值
文本模式输出 一条日志恒为一行(控制字符已转义);花括号配平

⭐ Star 历史

Star History Chart

许可证

该项目使用 MIT 许可证,详见 LICENSE 文件

Documentation

Overview

* @Author: kamalyes 501893067@qq.com * @Date: 2025-12-19 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-12-19 22:59:30 * @FilePath: \go-toolbox\pkg\logger\console.go * @Description: JavaScript console 风格的日志分组和表格功能 * * Copyright (c) 2025 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-11-07 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-01 10:38:52 * @FilePath: \go-toolbox\pkg\logger\context.go * @Description: * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-09-18 11:15:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-12-19 23:27:35 * @FilePath: \go-toolbox\pkg\logger\empty.go * @Description: 空日志实现,用于禁用日志输出的场景 * * Copyright (c) 2025 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-09-30 18:02:53 * @FilePath: \go-toolbox\pkg\logger\escape.go * @Description: 文本模式控制字符转义(防日志注入,保持一条日志恒为一行) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-01 18:30:05 * @FilePath: \go-toolbox\pkg\logger\failure.go * @Description: 持续失败的限频汇总(避免故障期间日志风暴) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-08-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-02 11:06:28 * @FilePath: \go-toolbox\pkg\logger\fields.go * @Description: 字段 Logger 的预编码字段存储与写出路径 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-01 18:30:05 * @FilePath: \go-toolbox\pkg\logger\identity.go * @Description: 服务身份固定字段(service / instance / env) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-11-07 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-11-09 16:00:00 * @FilePath: \go-toolbox\pkg\logger\interfaces.go * @Description: 日志接口定义 - 增强版本,支持多种日志框架的参数格式 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-11-07 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-11-22 12:33:32 * @FilePath: \go-toolbox\pkg\logger\level.go * @Description: 统一的日志级别定义和管理 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-02 11:06:28 * @FilePath: \go-toolbox\pkg\logger\limit.go * @Description: 单条日志的字节上限与超限裁剪 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-11-07 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-02 11:06:28 * @FilePath: \go-toolbox\pkg\logger\logger.go * @Description: 统一的日志工具包,支持 emoji 和结构化日志 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-02-02 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-02-02 00:00:00 * @FilePath: \go-toolbox\pkg\logger\output.go * @Description: 输出类型和配置 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-02 09:57:31 * @FilePath: \go-toolbox\pkg\logger\sanitize.go * @Description: 敏感字段脱敏(按字段名零分配判定 + 可选的值内容扫描) * * 规则表与字段名判定已迁至 github.com/HitGameAI/apex-toolbox/pkg/desensitize: * 那 200 余条敏感字段名、后缀规则与运维豁免表属于安全基线,同时存在两份迟早漂移, * 而报文脱敏、结构体脱敏等场景同样需要它们 * 迁走的是不依赖 Logger 的纯逻辑(规则表、形状位图、后缀字典树、掩码追加器), * 本文件保留 Logger 侧的接入:脱敏强度开关、与 JSON / text 编码器的衔接、 * 值内容扫描与长度截断的配合 * * 日志用的是严格档 ActionForKey(精确 + 后缀 + 运维豁免): * 误擦会让 service_name、status_code 这类排障主线索消失,宁可漏擦由调用方补注册 * 报文脱敏用的是宽松档,见 go-desensitize 的 doc.go * * 不保留同名转发层:本库尚无外部使用者依赖这些内部符号,直呼上游更易读 * go-desensitize 自身零第三方依赖,因此本库的依赖闭包只增加它一个包 * * [EN] The rule tables and key-name decision moved to go-desensitize: those * 200-odd key names, suffix rules and ops-visibility exemptions are a security * baseline that would drift if kept in two places. Only the Logger-side glue * stays here. Logs use the strict strength, where a false positive erases the * operator's diagnostic trail. go-desensitize has no third-party dependencies * of its own, so this library's closure grows by exactly one package * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-26 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-02 09:57:31 * @FilePath: \go-toolbox\pkg\logger\scan.go * @Description: 文本内容的敏感信息扫描(SanitizeKeysAndValues 模式,手写单遍扫描) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-27 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-01 09:26:08 * @FilePath: \go-toolbox\pkg\logger\stdout.go * @Description: 进程级共享的标准流异步输出器(默认输出目标) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-03-01 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-03-01 03:36:57 * @FilePath: \go-toolbox\pkg\logger\time.go * @Description: 时间戳追加快速路径(秒级前缀缓存 + 跳过 layout 逐 chunk 解析) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-12-19 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-12-19 23:52:45 * @FilePath: \go-toolbox\pkg\logger\timer.go * @Description: 计时器功能,类似 JavaScript console.time() * * Copyright (c) 2025 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-01-27 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-01 09:26:08 * @FilePath: \go-toolbox\pkg\logger\tty.go * @Description: 输出目标的着色能力探测(NO_COLOR / 字符设备判定) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-11-07 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-01 18:30:05 * @FilePath: \go-toolbox\pkg\logger\types.go * @Description: 核心类型定义 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2026-09-10 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-09-30 18:02:53 * @FilePath: \go-toolbox\pkg\logger\value.go * @Description: 值格式化与显示宽度工具(自包含实现,零外部依赖) * * Copyright (c) 2026 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-11-07 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-10-02 15:19:07 * @FilePath: \go-toolbox\pkg\logger\writer.go * @Description: 日志输出器实现 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

Index

Constants

View Source
const (
	// DefaultFailureInterval 汇总间隔的默认值
	DefaultFailureInterval = time.Minute

	// FieldFailureCount 本轮连续失败的累计次数
	FieldFailureCount = "failure_count"
	// FieldSuppressedCount 自上一条汇总以来被压制的失败次数
	FieldSuppressedCount = "suppressed_count"
	// FieldFailureDurationMS 自首次失败起的持续时长(毫秒)
	FieldFailureDurationMS = "failure_duration_ms"
)
View Source
const (
	// FieldService 服务名字段
	FieldService = "service"
	// FieldInstance 实例(副本)标识字段
	FieldInstance = "instance"
	// FieldEnv 部署环境字段
	FieldEnv = "env"
)
View Source
const (
	ColorBlack   = "\033[30m"
	ColorRed     = "\033[31m"
	ColorGreen   = "\033[32m"
	ColorYellow  = "\033[33m"
	ColorBlue    = "\033[34m"
	ColorMagenta = "\033[35m"
	ColorCyan    = "\033[36m"
	ColorWhite   = "\033[37m"
	ColorGray    = "\033[90m"

	// 亮色版本
	ColorBrightRed     = "\033[91m"
	ColorBrightGreen   = "\033[92m"
	ColorBrightYellow  = "\033[93m"
	ColorBrightBlue    = "\033[94m"
	ColorBrightMagenta = "\033[95m"
	ColorBrightCyan    = "\033[96m"
	ColorBrightWhite   = "\033[97m"
)

预定义颜色常量

View Source
const (
	DefaultMaxSize        = 100 * 1024 * 1024   // 默认最大文件大小 100MB
	DefaultMaxFiles       = 5                   // 默认最大文件数
	DefaultFilePermission = 0644                // 默认文件权限
	DefaultDirPermission  = 0755                // 默认目录权限
	DefaultMaxAge         = 30 * 24 * time.Hour // 默认最大保留时间 30天
	DefaultBufferSize     = 4096                // 默认缓冲区大小 4KB

	DefaultConsoleQueueSize     = 4096                   // 控制台输出器异步队列深度(条数)
	DefaultConsoleBatchBytes    = 64 * 1024              // 控制台输出器合并写出字节上限(单次写出体量)
	DefaultConsoleFlushInterval = 100 * time.Millisecond // 控制台输出器定时刷写间隔
)

默认配置常量

View Source
const (
	ErrMsgFilePathEmpty   = "file_path is required for file output"
	ErrMsgRotatePathEmpty = "file_path is required for rotate output"
)

错误消息常量

View Source
const ColorReset = "\033[0m"

ColorReset 颜色重置代码

View Source
const ContextKeyTraceID = "trace_id"

ContextKeyTraceID 是 traceId 在日志输出的字段名,同时作为 ctx.Value 的 fallback key traceId 的唯一真相源是 OTel span(gRPC 的 otelgrpc StatsHandler / HTTP 的 Tracing 中间件创建) extract 优先从 OTel span 提取;当 ctx 不在 span 内时,fallback 到 ctx.Value("trace_id")

View Source
const (
	// DefaultMaxLineBytes 单条日志的默认字节上限
	//
	// 取 64KB:正常日志(含带堆栈的错误日志)远低于此值,不会被动截断;
	// 同时把失控的大 payload 挡在对象池阈值的量级附近,避免池抖动扩散
	DefaultMaxLineBytes = 64 * 1024
)

Variables

View Source
var (
	SuccessType     = SpecialLogType{"✅", "SUCCESS"}
	LoadingType     = SpecialLogType{"⏳", "LOADING"}
	ConfigType      = SpecialLogType{"⚙️", "CONFIG"}
	StartType       = SpecialLogType{"🚀", "START"}
	StopType        = SpecialLogType{"🛑", "STOP"}
	DatabaseType    = SpecialLogType{"💾", "DATABASE"}
	NetworkType     = SpecialLogType{"🌐", "NETWORK"}
	SecurityType    = SpecialLogType{"🔒", "SECURITY"}
	CacheType       = SpecialLogType{"🗄️", "CACHE"}
	EnvironmentType = SpecialLogType{"🌍", "ENV"}
)

特殊日志类型定义

Functions

func CleanupExpiredTimers

func CleanupExpiredTimers(maxAge time.Duration) int

CleanupExpiredTimers 手动清理超过指定时间未结束的计时器

func Close

func Close() error

Close 刷写并关闭共享标准流输出器(停止后台 flusher) 不关闭 os.Stdout/os.Stderr 本身,关闭后向该输出器写日志将失败, 故仅应在进程退出前调用;常规优雅退出用 Flush 即可

func ContextWithTraceID

func ContextWithTraceID(ctx context.Context, traceID string) context.Context

ContextWithTraceID 创建携带 trace_id 的 context 如果 ctx 已有 trace_id 则不覆盖(尊重上游传入的值)

func DefaultContextKeys

func DefaultContextKeys() []compiledContextKey

DefaultContextKeys 返回默认上下文提取 key

func DetectInstance

func DetectInstance() string

DetectInstance 推导当前实例标识 依次尝试 INSTANCE_ID、POD_NAME、HOSTNAME 环境变量,再回落到主机名,最后返回 unknown

func ExtractTraceFromIncoming

func ExtractTraceFromIncoming(ctx context.Context) string

ExtractTraceFromIncoming 从 gRPC incoming metadata 提取 trace_id 优先级:OTel span > metadata > ctx.Value 用于 gRPC 服务端接收到远程节点请求时恢复 trace

func ExtractTraceID

func ExtractTraceID(ctx context.Context) string

ExtractTraceID 从 ctx 提取 trace_id 优先级:OTel span > ctx.Value(ContextKeyTraceID) > 空 直接复用 context.go 的 extractOTelTraceID,保证与日志输出使用同一真相源

func Flush

func Flush() error

Flush 刷写共享标准流输出器中已入队但未落盘的日志条目

应在优雅退出链路(SIGTERM/SIGINT 处理、main 的 defer)中调用, 否则队列中最多 DefaultConsoleFlushInterval 内的条目会随进程退出丢失:

func main() {
    defer logger.Flush()
    ...
}

只刷写已被构造的单例,未使用过的流不会因此被初始化

func GetActiveTimersCount

func GetActiveTimersCount() int

GetActiveTimersCount 获取当前活跃的计时器数量

func GetAllCategories

func GetAllCategories() []string

GetAllCategories 获取所有类别

func GetAllLevelNames

func GetAllLevelNames() []string

GetAllLevelNames 获取所有级别名称(包括扩展级别)

func GetLevelNames

func GetLevelNames() []string

GetLevelNames 获取基础级别名称 (保持向后兼容)

func GetLevelShortNames

func GetLevelShortNames() []string

GetLevelShortNames 获取所有级别短名称

func InjectTraceToOutgoing

func InjectTraceToOutgoing(ctx context.Context, traceID string) context.Context

InjectTraceToOutgoing 将 trace_id 注入 gRPC outgoing metadata 用于 gRPC 客户端调用远程节点时传播 trace 确保 OTel 未启用时仍可传播

func IsEmptyLogger

func IsEmptyLogger(logger ILogger) bool

IsEmptyLogger 检查给定的logger是否是空日志实现

func RegisterSensitiveKeys

func RegisterSensitiveKeys(keys ...string)

RegisterSensitiveKeys 追加自定义敏感字段名(归一化后参与精确匹配,整体擦除) 全进程生效:敏感字段清单属于安全基线,不应因 Logger 实例不同而不同 应在启动阶段调用完毕,规则表在日志路径上只读

func RestoreTraceFromIncoming

func RestoreTraceFromIncoming(ctx context.Context) context.Context

RestoreTraceFromIncoming 从 gRPC incoming 恢复 trace_id 到 ctx 如果提取到 trace_id 但 ctx 中没有,则注入到 ctx.Value 返回增强后的 ctx,供下游 logger 自动输出 trace_id

func SetGlobalLevel

func SetGlobalLevel(level LogLevel)

SetGlobalLevel 设置全局日志级别

func SetGlobalShowCaller

func SetGlobalShowCaller(show bool)

SetGlobalShowCaller 设置全局是否显示调用者信息

func SetTimerCleanupInterval

func SetTimerCleanupInterval(interval time.Duration)

SetTimerCleanupInterval 设置清理间隔(可选配置,立即生效,触发 cleanup goroutine 重建 ticker)

func SetTimerMaxAge

func SetTimerMaxAge(maxAge time.Duration)

SetTimerMaxAge 设置计时器最大存活时间(可选配置,热更新,线程安全)

func UnregisterSensitiveKeys

func UnregisterSensitiveKeys(keys ...string)

UnregisterSensitiveKeys 移除此前追加的敏感字段名,内置规则不受影响 主要供测试在用例之间复原全局状态

Types

type BufferedWriter

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

BufferedWriter 缓冲输出器(为底层输出器添加可配置的缓冲层)

func (*BufferedWriter) Close

func (w *BufferedWriter) Close() error

Close 关闭输出器

func (*BufferedWriter) Flush

func (w *BufferedWriter) Flush() error

Flush 刷新缓冲区

func (*BufferedWriter) GetStats

func (w *BufferedWriter) GetStats() WriterStatsSnapshot

GetStats 获取统计信息

func (*BufferedWriter) IsHealthy

func (w *BufferedWriter) IsHealthy() bool

IsHealthy 检查健康状态

func (*BufferedWriter) Write

func (w *BufferedWriter) Write(p []byte) (n int, err error)

Write 实现io.Writer接口

func (*BufferedWriter) WriteLevel

func (w *BufferedWriter) WriteLevel(level LogLevel, data []byte) (n int, err error)

WriteLevel 按级别写入

type BufferedWriterOption

type BufferedWriterOption func(*BufferedWriter)

BufferedWriterOption 缓冲输出器配置选项

func WithBufferSize

func WithBufferSize(bufferSize int) BufferedWriterOption

WithBufferSize 设置缓冲区大小

func WithBufferedLevel

func WithBufferedLevel(level LogLevel) BufferedWriterOption

WithBufferedLevel 设置日志级别

func WithBufferedUnderlying

func WithBufferedUnderlying(underlying IWriter) BufferedWriterOption

WithBufferedUnderlying 设置底层输出器

type CallerInfo

type CallerInfo struct {
	File     string `json:"file"`
	Line     int    `json:"line"`
	Function string `json:"function"`
}

CallerInfo 调用者信息

type ConsoleGroup

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

ConsoleGroup 控制台分组 所有输出直接写入 output(默认 os.Stdout),不走 logger 的 JSON/文本格式化 这样启动横幅、表格等控制台展示内容不会污染 JSON 日志流

func NewConsoleGroup

func NewConsoleGroup() *ConsoleGroup

NewConsoleGroup 创建新的控制台分组(包级函数,输出到 os.Stdout)

func (*ConsoleGroup) Debug

func (cg *ConsoleGroup) Debug(format string, args ...interface{})

Debug 在分组中记录 Debug 级别日志

func (*ConsoleGroup) DebugContext

func (cg *ConsoleGroup) DebugContext(ctx context.Context, format string, args ...interface{})

DebugContext 在分组中记录带上下文的 Debug 级别日志

func (*ConsoleGroup) Error

func (cg *ConsoleGroup) Error(format string, args ...interface{})

Error 在分组中记录 Error 级别日志

func (*ConsoleGroup) ErrorContext

func (cg *ConsoleGroup) ErrorContext(ctx context.Context, format string, args ...interface{})

ErrorContext 在分组中记录带上下文的 Error 级别日志

func (*ConsoleGroup) Group

func (cg *ConsoleGroup) Group(label string, args ...interface{})

Group 开始一个新的日志分组 类似 JavaScript console.group()

func (*ConsoleGroup) GroupCollapsed

func (cg *ConsoleGroup) GroupCollapsed(label string, args ...interface{})

GroupCollapsed 开始一个折叠的日志分组 类似 JavaScript console.groupCollapsed() 在折叠状态下,该分组内的日志将不会输出(除非日志级别为 ERROR 或 FATAL)

func (*ConsoleGroup) GroupEnd

func (cg *ConsoleGroup) GroupEnd()

GroupEnd 结束当前分组 类似 JavaScript console.groupEnd()

func (*ConsoleGroup) Info

func (cg *ConsoleGroup) Info(format string, args ...interface{})

Info 在分组中记录 Info 级别日志

func (*ConsoleGroup) InfoContext

func (cg *ConsoleGroup) InfoContext(ctx context.Context, format string, args ...interface{})

InfoContext 在分组中记录带上下文的 Info 级别日志

func (*ConsoleGroup) Log

func (cg *ConsoleGroup) Log(level LogLevel, format string, args ...interface{})

Log 在当前分组中记录日志

func (*ConsoleGroup) Table

func (cg *ConsoleGroup) Table(data interface{})

Table 在分组中显示表格 类似 JavaScript console.table()

func (*ConsoleGroup) Time

func (cg *ConsoleGroup) Time(label string) *Timer

Time 开始计时 类似 JavaScript console.time()

func (*ConsoleGroup) Warn

func (cg *ConsoleGroup) Warn(format string, args ...interface{})

Warn 在分组中记录 Warn 级别日志

func (*ConsoleGroup) WarnContext

func (cg *ConsoleGroup) WarnContext(ctx context.Context, format string, args ...interface{})

WarnContext 在分组中记录带上下文的 Warn 级别日志

type ConsoleTable

type ConsoleTable struct {
	Headers []string
	Rows    [][]string
}

ConsoleTable 表格数据结构

type ConsoleWriterOption

type ConsoleWriterOption func(*consoleLogWriter)

ConsoleWriterOption 控制台输出器配置选项

func WithConsoleBatchBytes

func WithConsoleBatchBytes(bytes int) ConsoleWriterOption

WithConsoleBatchBytes 设置合并写出字节上限(默认 64KB,达到即触发一次合并写出)

func WithConsoleColor

func WithConsoleColor(color bool) ConsoleWriterOption

WithConsoleColor 设置是否启用颜色

func WithConsoleFlushInterval

func WithConsoleFlushInterval(interval time.Duration) ConsoleWriterOption

WithConsoleFlushInterval 设置定时刷写间隔(默认 100ms)

func WithConsoleLevel

func WithConsoleLevel(level LogLevel) ConsoleWriterOption

WithConsoleLevel 设置日志级别

func WithConsoleOutput

func WithConsoleOutput(output io.Writer) ConsoleWriterOption

WithConsoleOutput 设置输出目标

func WithConsoleQueueSize

func WithConsoleQueueSize(bytes int) ConsoleWriterOption

WithConsoleQueueSize 设置待写缓冲的硬上限(字节)

早期实现是按条数限制的队列深度,双缓冲改造后待写量以字节计,故语义改为字节上限: 活动缓冲涨过此值时降级为持锁同步直写,形成背压。<=0 表示按 batchBytes 自动推导

type ContextExtractor

type ContextExtractor func(ctx context.Context) string

ContextExtractor 上下文信息提取器函数类型

type EmptyAdapter

type EmptyAdapter struct {
	*EmptyLogger
	// contains filtered or unexported fields
}

EmptyAdapter 是 IAdapter 接口的空实现

func NewEmptyAdapter

func NewEmptyAdapter(name string) *EmptyAdapter

NewEmptyAdapter 创建一个新的空适配器

func (*EmptyAdapter) Close

func (e *EmptyAdapter) Close() error

Close 关闭适配器(空实现)

func (*EmptyAdapter) Flush

func (e *EmptyAdapter) Flush() error

Flush 刷新缓冲区(空实现)

func (*EmptyAdapter) GetAdapterName

func (e *EmptyAdapter) GetAdapterName() string

GetAdapterName 获取适配器名称

func (*EmptyAdapter) GetAdapterVersion

func (e *EmptyAdapter) GetAdapterVersion() string

GetAdapterVersion 获取适配器版本

func (*EmptyAdapter) Initialize

func (e *EmptyAdapter) Initialize() error

Initialize 初始化适配器(空实现)

func (*EmptyAdapter) IsHealthy

func (e *EmptyAdapter) IsHealthy() bool

IsHealthy 检查适配器健康状态

func (*EmptyAdapter) SetHealthy

func (e *EmptyAdapter) SetHealthy(healthy bool)

SetHealthy 设置适配器健康状态

type EmptyHook

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

EmptyHook 是 IHook 接口的空实现

func NewEmptyHook

func NewEmptyHook(levels []LogLevel) *EmptyHook

NewEmptyHook 创建一个新的空钩子

func (*EmptyHook) Fire

func (e *EmptyHook) Fire(entry *LogEntry) error

Fire 执行钩子(空实现)

func (*EmptyHook) Levels

func (e *EmptyHook) Levels() []LogLevel

Levels 获取支持的级别

type EmptyLogger

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

EmptyLogger 是 ILogger 接口的空实现,所有方法都不执行任何操作 常用于测试环境或需要禁用日志输出的场景

func NewEmptyLogger

func NewEmptyLogger() *EmptyLogger

NewEmptyLogger 创建一个新的 EmptyLogger 实例

func NewEmptyLoggerWithLevel

func NewEmptyLoggerWithLevel(level LogLevel) *EmptyLogger

NewEmptyLoggerWithLevel 创建一个指定级别的空日志实例

func (*EmptyLogger) Clone

func (e *EmptyLogger) Clone() ILogger

实用方法

func (*EmptyLogger) ConsoleGroup

func (e *EmptyLogger) ConsoleGroup(label string, args ...interface{})

ConsoleGroup 空实现 - 开始分组(不执行任何操作)

func (*EmptyLogger) ConsoleGroupCollapsed

func (e *EmptyLogger) ConsoleGroupCollapsed(label string, args ...interface{})

ConsoleGroupCollapsed 空实现 - 开始折叠分组(不执行任何操作)

func (*EmptyLogger) ConsoleGroupEnd

func (e *EmptyLogger) ConsoleGroupEnd()

ConsoleGroupEnd 空实现 - 结束分组(不执行任何操作)

func (*EmptyLogger) ConsoleTable

func (e *EmptyLogger) ConsoleTable(data interface{})

ConsoleTable 空实现 - 显示表格(不执行任何操作)

func (*EmptyLogger) ConsoleTime

func (e *EmptyLogger) ConsoleTime(label string) *Timer

ConsoleTime 空实现 - 开始计时(返回空的计时器)

func (*EmptyLogger) Debug

func (e *EmptyLogger) Debug(format string, args ...interface{})

基本日志方法 - 所有方法都是空实现

func (*EmptyLogger) DebugContext

func (e *EmptyLogger) DebugContext(ctx context.Context, format string, args ...interface{})

带上下文的日志方法

func (*EmptyLogger) DebugContextKV

func (e *EmptyLogger) DebugContextKV(ctx context.Context, msg string, keysAndValues ...interface{})

带上下文的结构化日志方法

func (*EmptyLogger) DebugContextLines

func (e *EmptyLogger) DebugContextLines(ctx context.Context, lines ...string)

多行日志方法(带上下文)

func (*EmptyLogger) DebugCtxReturn

func (e *EmptyLogger) DebugCtxReturn(ctx context.Context, format string, args ...interface{}) error

返回错误的上下文日志方法

func (*EmptyLogger) DebugKV

func (e *EmptyLogger) DebugKV(msg string, keysAndValues ...interface{})

结构化日志方法(键值对)

func (*EmptyLogger) DebugKVReturn

func (e *EmptyLogger) DebugKVReturn(msg string, keysAndValues ...interface{}) error

返回错误的键值对日志方法

func (*EmptyLogger) DebugLines

func (e *EmptyLogger) DebugLines(lines ...string)

func (*EmptyLogger) DebugMsg

func (e *EmptyLogger) DebugMsg(msg string)

纯文本日志方法

func (*EmptyLogger) DebugReturn

func (e *EmptyLogger) DebugReturn(format string, args ...interface{}) error

返回错误的日志方法

func (*EmptyLogger) DebugWithFields

func (e *EmptyLogger) DebugWithFields(msg string, fields map[string]interface{})

字段映射方法(直接支持 map[string]interface{})

func (*EmptyLogger) Debugf

func (e *EmptyLogger) Debugf(format string, args ...interface{})

Printf风格方法(与上面相同,但命名更明确)

func (*EmptyLogger) Error

func (e *EmptyLogger) Error(format string, args ...interface{})

func (*EmptyLogger) ErrorContext

func (e *EmptyLogger) ErrorContext(ctx context.Context, format string, args ...interface{})

func (*EmptyLogger) ErrorContextKV

func (e *EmptyLogger) ErrorContextKV(ctx context.Context, msg string, keysAndValues ...interface{})

func (*EmptyLogger) ErrorContextLines

func (e *EmptyLogger) ErrorContextLines(ctx context.Context, lines ...string)

func (*EmptyLogger) ErrorCtxReturn

func (e *EmptyLogger) ErrorCtxReturn(ctx context.Context, format string, args ...interface{}) error

func (*EmptyLogger) ErrorKV

func (e *EmptyLogger) ErrorKV(msg string, keysAndValues ...interface{})

func (*EmptyLogger) ErrorKVReturn

func (e *EmptyLogger) ErrorKVReturn(msg string, keysAndValues ...interface{}) error

func (*EmptyLogger) ErrorLines

func (e *EmptyLogger) ErrorLines(lines ...string)

func (*EmptyLogger) ErrorMsg

func (e *EmptyLogger) ErrorMsg(msg string)

func (*EmptyLogger) ErrorReturn

func (e *EmptyLogger) ErrorReturn(format string, args ...interface{}) error

func (*EmptyLogger) ErrorWithFields

func (e *EmptyLogger) ErrorWithFields(msg string, fields map[string]interface{})

func (*EmptyLogger) Errorf

func (e *EmptyLogger) Errorf(format string, args ...interface{})

func (*EmptyLogger) Fatal

func (e *EmptyLogger) Fatal(format string, args ...interface{})

func (*EmptyLogger) FatalContext

func (e *EmptyLogger) FatalContext(ctx context.Context, format string, args ...interface{})

func (*EmptyLogger) FatalContextKV

func (e *EmptyLogger) FatalContextKV(ctx context.Context, msg string, keysAndValues ...interface{})

func (*EmptyLogger) FatalKV

func (e *EmptyLogger) FatalKV(msg string, keysAndValues ...interface{})

func (*EmptyLogger) FatalMsg

func (e *EmptyLogger) FatalMsg(msg string)

func (*EmptyLogger) FatalWithFields

func (e *EmptyLogger) FatalWithFields(msg string, fields map[string]interface{})

func (*EmptyLogger) Fatalf

func (e *EmptyLogger) Fatalf(format string, args ...interface{})

func (*EmptyLogger) GetLevel

func (e *EmptyLogger) GetLevel() LogLevel

func (*EmptyLogger) GetStats

func (e *EmptyLogger) GetStats() *LoggerStats

GetStats 返回统计信息

func (*EmptyLogger) Info

func (e *EmptyLogger) Info(format string, args ...interface{})

func (*EmptyLogger) InfoContext

func (e *EmptyLogger) InfoContext(ctx context.Context, format string, args ...interface{})

func (*EmptyLogger) InfoContextKV

func (e *EmptyLogger) InfoContextKV(ctx context.Context, msg string, keysAndValues ...interface{})

func (*EmptyLogger) InfoContextLines

func (e *EmptyLogger) InfoContextLines(ctx context.Context, lines ...string)

func (*EmptyLogger) InfoCtxReturn

func (e *EmptyLogger) InfoCtxReturn(ctx context.Context, format string, args ...interface{}) error

func (*EmptyLogger) InfoKV

func (e *EmptyLogger) InfoKV(msg string, keysAndValues ...interface{})

func (*EmptyLogger) InfoKVReturn

func (e *EmptyLogger) InfoKVReturn(msg string, keysAndValues ...interface{}) error

func (*EmptyLogger) InfoLines

func (e *EmptyLogger) InfoLines(lines ...string)

多行日志方法

func (*EmptyLogger) InfoMsg

func (e *EmptyLogger) InfoMsg(msg string)

func (*EmptyLogger) InfoReturn

func (e *EmptyLogger) InfoReturn(format string, args ...interface{}) error

func (*EmptyLogger) InfoWithFields

func (e *EmptyLogger) InfoWithFields(msg string, fields map[string]interface{})

func (*EmptyLogger) Infof

func (e *EmptyLogger) Infof(format string, args ...interface{})

func (*EmptyLogger) IsLevelEnabled

func (e *EmptyLogger) IsLevelEnabled(level LogLevel) bool

func (*EmptyLogger) IsShowCaller

func (e *EmptyLogger) IsShowCaller() bool

func (*EmptyLogger) Log

func (e *EmptyLogger) Log(level LogLevel, msg string)

原始日志条目方法

func (*EmptyLogger) LogContext

func (e *EmptyLogger) LogContext(ctx context.Context, level LogLevel, msg string)

func (*EmptyLogger) LogKV

func (e *EmptyLogger) LogKV(level LogLevel, msg string, keysAndValues ...interface{})

func (*EmptyLogger) LogSpecialContext

func (e *EmptyLogger) LogSpecialContext(ctx context.Context, logType SpecialLogType, level LogLevel, format string, args ...interface{})

特殊类型日志方法(空实现)

func (*EmptyLogger) LogWithFields

func (e *EmptyLogger) LogWithFields(level LogLevel, msg string, fields map[string]interface{})

func (*EmptyLogger) NewConsoleGroup

func (e *EmptyLogger) NewConsoleGroup() *ConsoleGroup

NewConsoleGroup 创建空的 ConsoleGroup(不执行任何操作)

func (*EmptyLogger) Print

func (e *EmptyLogger) Print(args ...interface{})

兼容标准log包的方法

func (*EmptyLogger) Printf

func (e *EmptyLogger) Printf(format string, args ...interface{})

func (*EmptyLogger) Println

func (e *EmptyLogger) Println(args ...interface{})

func (*EmptyLogger) SetLevel

func (e *EmptyLogger) SetLevel(level LogLevel)

配置方法

func (*EmptyLogger) SetShowCaller

func (e *EmptyLogger) SetShowCaller(show bool)

func (*EmptyLogger) Warn

func (e *EmptyLogger) Warn(format string, args ...interface{})

func (*EmptyLogger) WarnContext

func (e *EmptyLogger) WarnContext(ctx context.Context, format string, args ...interface{})

func (*EmptyLogger) WarnContextKV

func (e *EmptyLogger) WarnContextKV(ctx context.Context, msg string, keysAndValues ...interface{})

func (*EmptyLogger) WarnContextLines

func (e *EmptyLogger) WarnContextLines(ctx context.Context, lines ...string)

func (*EmptyLogger) WarnCtxReturn

func (e *EmptyLogger) WarnCtxReturn(ctx context.Context, format string, args ...interface{}) error

func (*EmptyLogger) WarnKV

func (e *EmptyLogger) WarnKV(msg string, keysAndValues ...interface{})

func (*EmptyLogger) WarnKVReturn

func (e *EmptyLogger) WarnKVReturn(msg string, keysAndValues ...interface{}) error

func (*EmptyLogger) WarnLines

func (e *EmptyLogger) WarnLines(lines ...string)

func (*EmptyLogger) WarnMsg

func (e *EmptyLogger) WarnMsg(msg string)

func (*EmptyLogger) WarnReturn

func (e *EmptyLogger) WarnReturn(format string, args ...interface{}) error

func (*EmptyLogger) WarnWithFields

func (e *EmptyLogger) WarnWithFields(msg string, fields map[string]interface{})

func (*EmptyLogger) Warnf

func (e *EmptyLogger) Warnf(format string, args ...interface{})

func (*EmptyLogger) WithContext

func (e *EmptyLogger) WithContext(ctx context.Context) ILogger

func (*EmptyLogger) WithError

func (e *EmptyLogger) WithError(err error) ILogger

func (*EmptyLogger) WithField

func (e *EmptyLogger) WithField(key string, value interface{}) ILogger

结构化日志构建器方法 - 返回自身以保持链式调用

func (*EmptyLogger) WithFields

func (e *EmptyLogger) WithFields(fields map[string]interface{}) ILogger

type EmptyWriter

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

EmptyWriter 是 IWriter 接口的空实现

func NewEmptyWriter

func NewEmptyWriter() *EmptyWriter

NewEmptyWriter 创建一个新的空写入器

func (*EmptyWriter) Close

func (e *EmptyWriter) Close() error

Close 关闭写入器(空实现)

func (*EmptyWriter) Flush

func (e *EmptyWriter) Flush() error

Flush 刷新缓冲区(空实现)

func (*EmptyWriter) GetStats

func (e *EmptyWriter) GetStats() interface{}

GetStats 获取统计信息

func (*EmptyWriter) IsHealthy

func (e *EmptyWriter) IsHealthy() bool

IsHealthy 检查写入器健康状态

func (*EmptyWriter) Write

func (e *EmptyWriter) Write(p []byte) (n int, err error)

Write 写入数据(空实现)

func (*EmptyWriter) WriteLevel

func (e *EmptyWriter) WriteLevel(level LogLevel, data []byte) (n int, err error)

WriteLevel 按级别写入数据(空实现)

type FailureLog

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

FailureLog 按"任务 + 错误类别"等键汇总持续失败并写日志,可并发使用

长时间没有新失败的键会被摊销清理且不输出恢复日志,内存只随"正在失败的键数" 增长,不随历史键数增长。

汇总字段 failure_count、suppressed_count、failure_duration_ms 写在调用方 字段之后,故同名时以汇总值为准;单次操作耗时等调用方数据应使用其他字段名

func NewFailureLog

func NewFailureLog(logger ILogger, cfg FailureLogConfig) *FailureLog

NewFailureLog 创建按键失败记录器

func (*FailureLog) Count

func (f *FailureLog) Count(key string) int64

Count 返回 key 当前的连续失败次数,可用于计算退避

func (*FailureLog) Fail

func (f *FailureLog) Fail(ctx context.Context, key string, level LogLevel, msg string, keysAndValues ...any)

Fail 记一次 key 的失败 首次立即按 level 输出,之后按间隔输出带累计次数的汇总;ctx 已结束时不记录

func (*FailureLog) Recover

func (f *FailureLog) Recover(ctx context.Context, key, msg string, keysAndValues ...any)

Recover 在 key 存在未恢复的失败时输出一条 INFO 并清除其状态 ctx 已结束时不记录

type FailureLogConfig

type FailureLogConfig struct {
	// Interval、MaxInterval 含义同 FailureState
	Interval    time.Duration
	MaxInterval time.Duration
	// IdleTTL 某个键最后一次失败后保留其状态的时长
	// <=0 时取 10 分钟与两倍 MaxInterval 中的较大值
	IdleTTL time.Duration
	// Now 供测试替换时钟
	Now func() time.Time
}

FailureLogConfig 按键失败记录器的配置

type FailureState

type FailureState struct {
	// Interval 汇总间隔,<=0 时取 DefaultFailureInterval
	Interval time.Duration
	// MaxInterval 大于 Interval 时,每输出一条后间隔翻倍直至该上限
	// 用于长时间卡死的依赖:故障初期密集反馈,持续故障后逐步稀释
	MaxInterval time.Duration
	// contains filtered or unexported fields
}

FailureState 单个失败源的限频状态

零值即可用(间隔取 DefaultFailureInterval)。只保存常量大小的状态, 并发保护与实际写日志由调用方负责——需要开箱即用的并发安全版本见 FailureLog

func (*FailureState) Count

func (s *FailureState) Count() int64

Count 返回当前连续失败次数,可用于计算退避

func (*FailureState) Fail

func (s *FailureState) Fail(now time.Time, force bool) ([]any, bool)

Fail 计入一次失败;需要输出日志时返回汇总字段与 true force 用于状态确实发生变化(如进入熔断)必须立即记录的场合

func (*FailureState) Recover

func (s *FailureState) Recover(now time.Time) ([]any, bool)

Recover 存在未恢复的失败时返回汇总字段与 true,并清零状态(保留间隔配置)

func (*FailureState) Remind

func (s *FailureState) Remind(now time.Time) []any

Remind 不计入新失败,再次输出当前汇总 用于故障持续期间的定时提醒,只应在 Fail 之后调用

type FileLogWriter

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

FileLogWriter 文件输出器(支持可配置缓冲区大小)

func (*FileLogWriter) Close

func (w *FileLogWriter) Close() error

Close 关闭文件(确保缓冲刷新)

func (*FileLogWriter) Flush

func (w *FileLogWriter) Flush() error

Flush 刷新文件缓冲区(先刷新缓冲再同步文件)

func (*FileLogWriter) GetStats

func (w *FileLogWriter) GetStats() WriterStatsSnapshot

GetStats 获取统计信息

func (*FileLogWriter) IsHealthy

func (w *FileLogWriter) IsHealthy() bool

IsHealthy 检查健康状态(使用 atomic 快速检查)

func (*FileLogWriter) Write

func (w *FileLogWriter) Write(p []byte) (n int, err error)

Write 实现io.Writer接口(写入缓冲区)

func (*FileLogWriter) WriteLevel

func (w *FileLogWriter) WriteLevel(level LogLevel, data []byte) (n int, err error)

WriteLevel 按级别写入

type FileWriterOption

type FileWriterOption func(*FileLogWriter)

FileWriterOption 文件输出器配置选项

func WithFileBufferSize

func WithFileBufferSize(size int) FileWriterOption

WithFileBufferSize 设置缓冲区大小(字节)

func WithFileLevel

func WithFileLevel(level LogLevel) FileWriterOption

WithFileLevel 设置日志级别

func WithFilePermission

func WithFilePermission(permission os.FileMode) FileWriterOption

WithFilePermission 设置文件权限

func WithFileWriterPath

func WithFileWriterPath(filePath string) FileWriterOption

WithFileWriterPath 设置文件路径

type FormatType

type FormatType string

FormatType 输出格式类型

const (
	FormatText FormatType = "text"
	FormatJSON FormatType = "json"
	FormatXML  FormatType = "xml"
	FormatCSV  FormatType = "csv"
)

type IAdapter

type IAdapter interface {
	ILogger

	// 生命周期管理
	Initialize() error
	Close() error
	Flush() error

	// 适配器特定功能
	GetAdapterName() string
	GetAdapterVersion() string
	IsHealthy() bool
}

IAdapter 日志适配器接口

type IAdvancedLogger

type IAdvancedLogger interface {
	ILogger

	// 采样和限流
	Sample(every int) ILogger
	RateLimit(rate float64) ILogger

	// 异步日志
	Async() ILogger
	Sync() error

	// 缓冲控制
	Buffer(size int) ILogger
	Flush() error

	// 条件日志
	If(condition bool) ILogger
	Unless(condition bool) ILogger
}

高级日志功能接口

type IFileWriter

type IFileWriter interface {
	io.WriteCloser

	// 文件管理
	Rotate() error
	GetCurrentFile() string
	GetFileSize() int64

	// 配置
	SetMaxSize(size int64)
	SetMaxBackups(backups int)
	SetMaxAge(days int)
	SetCompress(compress bool)
}

IFileWriter 文件写入器接口

type IFormatter

type IFormatter interface {
	Format(entry *LogEntry) ([]byte, error)
	GetName() string
}

IFormatter 日志格式化器接口

type IFrameworkAdapter

type IFrameworkAdapter interface {
	ILogger

	// 框架检测
	GetFrameworkName() string
	GetFrameworkVersion() string

	// 原生框架实例
	GetNativeLogger() interface{}

	// 配置同步
	SyncConfig() error
}

通用日志适配器接口

type IHook

type IHook interface {
	Fire(entry *LogEntry) error
	Levels() []LogLevel
}

IHook 日志钩子接口

type ILogBuilder

type ILogBuilder interface {
	Level(level LogLevel) ILogBuilder
	Message(msg string) ILogBuilder
	Field(key string, value interface{}) ILogBuilder
	Fields(fields map[string]interface{}) ILogBuilder
	Error(err error) ILogBuilder
	Context(ctx context.Context) ILogBuilder
	Caller(skip int) ILogBuilder
	Timestamp(t interface{}) ILogBuilder
	Build() *LogEntry
	Log()
}

构建器模式接口

type ILogger

type ILogger interface {
	// 基本日志方法(Printf风格)
	Debug(format string, args ...interface{})
	Info(format string, args ...interface{})
	Warn(format string, args ...interface{})
	Error(format string, args ...interface{})
	Fatal(format string, args ...interface{})

	// Printf风格日志方法(与上面相同,但命名更明确)
	Debugf(format string, args ...interface{})
	Infof(format string, args ...interface{})
	Warnf(format string, args ...interface{})
	Errorf(format string, args ...interface{})
	Fatalf(format string, args ...interface{})

	// 纯文本日志方法(支持单个消息)
	DebugMsg(msg string)
	InfoMsg(msg string)
	WarnMsg(msg string)
	ErrorMsg(msg string)
	FatalMsg(msg string)

	// 返回错误的日志方法(记录日志并返回错误)
	DebugReturn(format string, args ...interface{}) error
	InfoReturn(format string, args ...interface{}) error
	WarnReturn(format string, args ...interface{}) error
	ErrorReturn(format string, args ...interface{}) error

	// 返回错误的上下文日志方法
	DebugCtxReturn(ctx context.Context, format string, args ...interface{}) error
	InfoCtxReturn(ctx context.Context, format string, args ...interface{}) error
	WarnCtxReturn(ctx context.Context, format string, args ...interface{}) error
	ErrorCtxReturn(ctx context.Context, format string, args ...interface{}) error

	// 返回错误的键值对日志方法
	DebugKVReturn(msg string, keysAndValues ...interface{}) error
	InfoKVReturn(msg string, keysAndValues ...interface{}) error
	WarnKVReturn(msg string, keysAndValues ...interface{}) error
	ErrorKVReturn(msg string, keysAndValues ...interface{}) error

	// 带上下文的日志方法
	DebugContext(ctx context.Context, format string, args ...interface{})
	InfoContext(ctx context.Context, format string, args ...interface{})
	WarnContext(ctx context.Context, format string, args ...interface{})
	ErrorContext(ctx context.Context, format string, args ...interface{})
	FatalContext(ctx context.Context, format string, args ...interface{})

	// 结构化日志方法(键值对)
	DebugKV(msg string, keysAndValues ...interface{})
	InfoKV(msg string, keysAndValues ...interface{})
	WarnKV(msg string, keysAndValues ...interface{})
	ErrorKV(msg string, keysAndValues ...interface{})
	FatalKV(msg string, keysAndValues ...interface{})

	// 结构化日志方法(字段映射)- 直接支持 map[string]interface{}
	DebugWithFields(msg string, fields map[string]interface{})
	InfoWithFields(msg string, fields map[string]interface{})
	WarnWithFields(msg string, fields map[string]interface{})
	ErrorWithFields(msg string, fields map[string]interface{})
	FatalWithFields(msg string, fields map[string]interface{})

	// 带上下文的结构化日志方法(键值对)
	DebugContextKV(ctx context.Context, msg string, keysAndValues ...interface{})
	InfoContextKV(ctx context.Context, msg string, keysAndValues ...interface{})
	WarnContextKV(ctx context.Context, msg string, keysAndValues ...interface{})
	ErrorContextKV(ctx context.Context, msg string, keysAndValues ...interface{})
	FatalContextKV(ctx context.Context, msg string, keysAndValues ...interface{})

	// 多行日志方法(自动处理多行格式)
	InfoLines(lines ...string)
	ErrorLines(lines ...string)
	WarnLines(lines ...string)
	DebugLines(lines ...string)

	// 多行日志方法(带上下文,每一行均附加 ctx 中的 trace 等信息)
	DebugContextLines(ctx context.Context, lines ...string)
	InfoContextLines(ctx context.Context, lines ...string)
	WarnContextLines(ctx context.Context, lines ...string)
	ErrorContextLines(ctx context.Context, lines ...string)

	// 原始日志条目方法(最灵活)
	Log(level LogLevel, msg string)
	LogContext(ctx context.Context, level LogLevel, msg string)
	LogKV(level LogLevel, msg string, keysAndValues ...interface{})
	LogWithFields(level LogLevel, msg string, fields map[string]interface{})

	// 特殊类型日志方法(带 context,支持 emoji 分类日志)
	LogSpecialContext(ctx context.Context, logType SpecialLogType, level LogLevel, format string, args ...interface{})

	// 配置方法
	SetLevel(level LogLevel)
	GetLevel() LogLevel
	SetShowCaller(show bool)
	IsShowCaller() bool
	IsLevelEnabled(level LogLevel) bool

	// 结构化日志构建器
	WithField(key string, value interface{}) ILogger
	WithFields(fields map[string]interface{}) ILogger
	WithError(err error) ILogger
	WithContext(ctx context.Context) ILogger

	// 实用方法
	Print(args ...interface{})                 // 兼容标准log包
	Printf(format string, args ...interface{}) // 兼容标准log包
	Println(args ...interface{})               // 兼容标准log包

	// Console 风格日志功能
	NewConsoleGroup() *ConsoleGroup                          // 创建控制台分组
	ConsoleGroup(label string, args ...interface{})          // 开始日志分组
	ConsoleGroupCollapsed(label string, args ...interface{}) // 开始折叠分组
	ConsoleGroupEnd()                                        // 结束当前分组
	ConsoleTable(data interface{})                           // 显示表格
	ConsoleTime(label string) *Timer                         // 开始计时
}

ILogger 增强的日志记录器接口,支持多种参数格式

var (
	// NoLogger 全局的空日志实例,用于禁用所有日志输出
	NoLogger ILogger = NewEmptyLogger()

	// DiscardLogger 废弃所有日志的实例,与NoLogger功能相同
	DiscardLogger ILogger = NewEmptyLogger()

	// NullLogger 空日志实例,用于测试场景
	NullLogger ILogger = NewEmptyLogger()
)

全局空日志实例

func WrapWithEmpty

func WrapWithEmpty(original ILogger) ILogger

WrapWithEmpty 将任何日志器包装为空实现(用于临时禁用日志)

type ILogrusLogger

type ILogrusLogger interface {
	// Logrus特有方法
	Trace(args ...interface{})
}

ILogrusLogger Logrus日志框架兼容接口

type IManager

type IManager interface {
	// 适配器管理
	AddAdapter(name string, adapter IAdapter) error
	GetAdapter(name string) (IAdapter, bool)
	RemoveAdapter(name string) error
	ListAdapters() []string

	// 生命周期管理
	CloseAll() error
	FlushAll() error

	// 全局设置
	SetLevelAll(level LogLevel)
	Broadcast(level LogLevel, format string, args ...interface{})

	// 健康检查
	HealthCheck() map[string]bool
}

IManager 日志管理器接口

type IMiddleware

type IMiddleware interface {
	Process(entry *LogEntry, next func(*LogEntry) error) error
	GetName() string
	GetPriority() int
}

IMiddleware 日志中间件接口

type ISlogLogger

type ISlogLogger interface {
	// slog特有方法
	LogAttrs(ctx context.Context, level LogLevel, msg string, attrs ...interface{})
	With(args ...interface{}) ISlogLogger
	WithGroup(name string) ISlogLogger
}

ISlogLogger 标准库slog兼容接口

type IWriter

type IWriter interface {
	io.Writer

	// 写入控制
	WriteLevel(level LogLevel, data []byte) (n int, err error)
	Flush() error
	Close() error

	// 状态查询
	IsHealthy() bool
	GetStats() WriterStatsSnapshot
}

IWriter 日志写入器接口

func CreateWriter

func CreateWriter(config *WriterConfig) (IWriter, error)

CreateWriter 根据配置创建 Writer

func DefaultOutput

func DefaultOutput() IWriter

DefaultOutput 返回默认输出目标:共享的 stdout 异步批量输出器 首次调用时惰性构造(启动后台 flusher),后续调用返回同一实例

func NewBufferedWriter

func NewBufferedWriter(opts ...BufferedWriterOption) IWriter

NewBufferedWriter 创建缓冲输出器

func NewConsoleWriter

func NewConsoleWriter(opts ...ConsoleWriterOption) IWriter

NewConsoleWriter 创建控制台输出器(内建异步批量管道,构造时启动后台 flusher)

func NewFileWriter

func NewFileWriter(opts ...FileWriterOption) IWriter

NewFileWriter 创建文件输出器

func NewMultiWriter

func NewMultiWriter(opts ...MultiWriterOption) IWriter

NewMultiWriter 创建多输出器

func NewRotateWriter

func NewRotateWriter(opts ...RotateWriterOption) IWriter

NewRotateWriter 创建轮转文件输出器

func StderrOutput

func StderrOutput() IWriter

StderrOutput 返回共享的 stderr 异步批量输出器 首次调用时惰性构造(启动后台 flusher),后续调用返回同一实例

type IZapLogger

type IZapLogger interface {
	// Zap特有方法
	DPanic(msg string, fields ...interface{})
	Sync() error
	Sugar() ILogger
}

IZapLogger Zap日志框架兼容接口

type IZerologLogger

type IZerologLogger interface {
	// Zerolog链式方法
	Str(key, val string) IZerologLogger
	Int(key string, i int) IZerologLogger
	Float64(key string, f float64) IZerologLogger
	Bool(key string, b bool) IZerologLogger
	Time(key string, t interface{}) IZerologLogger
	Dur(key string, d interface{}) IZerologLogger
	Msg(msg string)
	Msgf(format string, v ...interface{})
}

IZerologLogger Zerolog兼容接口

type LevelInfo

type LevelInfo struct {
	Name        string `json:"name"`        // 级别名称
	ShortName   string `json:"short_name"`  // 短名称
	Emoji       string `json:"emoji"`       // 表情符号
	Color       string `json:"color"`       // 颜色代码
	Priority    int    `json:"priority"`    // 优先级
	Description string `json:"description"` // 描述
	Category    string `json:"category"`    // 类别
}

LevelInfo 级别信息结构

type LogArgs

type LogArgs struct {
	Format  string
	Args    []interface{}
	Fields  map[string]interface{}
	Context context.Context
}

日志参数辅助类型

type LogEntry

type LogEntry struct {
	Level     LogLevel               `json:"level"`
	Message   string                 `json:"message"`
	Timestamp int64                  `json:"timestamp"`
	Fields    map[string]interface{} `json:"fields,omitempty"`
	Caller    *CallerInfo            `json:"caller,omitempty"`
}

LogEntry 日志条目

type LogLevel

type LogLevel int

LogLevel 日志级别类型 (保持向后兼容)

const (
	DEBUG LogLevel = iota // 调试级别 - 最详细的信息
	INFO                  // 信息级别 - 一般信息
	WARN                  // 警告级别 - 警告信息
	ERROR                 // 错误级别 - 错误信息
	FATAL                 // 致命级别 - 致命错误,程序将退出
)

基础日志级别常量 (保持现有API兼容性)

const (
	TRACE LogLevel = -1 // 跟踪级别 - 更详细的调试信息
	OFF   LogLevel = 99 // 关闭级别 - 禁用所有日志
)

扩展级别常量 (新增的高级功能)

const (
	SYSTEM      LogLevel = 100 + iota // 系统级信息
	KERNEL                            // 内核级信息
	DRIVER                            // 驱动级信息
	APPLICATION                       // 应用级信息
	SERVICE                           // 服务级信息
	COMPONENT                         // 组件级信息
	MODULE                            // 模块级信息
)

系统级扩展级别

const (
	BUSINESS    LogLevel = 200 + iota // 业务级信息
	TRANSACTION                       // 事务级信息
	WORKFLOW                          // 工作流信息
	PROCESS                           // 流程级信息
)

业务级扩展级别

const (
	SECURITY   LogLevel = 300 + iota // 安全级信息
	AUDIT                            // 审计级信息
	COMPLIANCE                       // 合规级信息
	THREAT                           // 威胁级信息
)

安全级扩展级别

const (
	PERFORMANCE LogLevel = 400 + iota // 性能级信息
	METRIC                            // 指标级信息
	BENCHMARK                         // 基准测试信息
	PROFILING                         // 性能分析信息
)

性能级扩展级别

func GetAllExtendedLevels

func GetAllExtendedLevels() []LogLevel

GetAllExtendedLevels 获取所有级别(包括扩展级别)

func GetAllLevels

func GetAllLevels() []LogLevel

GetAllLevels 获取所有基础级别 (保持向后兼容)

func GetBasicLevels

func GetBasicLevels() []LogLevel

GetBasicLevels 获取基础级别

func GetExtendedLevels

func GetExtendedLevels() []LogLevel

GetExtendedLevels 获取扩展级别(不包括基础级别)

func GetLevelsByCategory

func GetLevelsByCategory(category string) []LogLevel

GetLevelsByCategory 根据类别获取级别

func ParseLevel

func ParseLevel(level string) (LogLevel, error)

ParseLevel 从字符串解析日志级别(支持大小写)

func (LogLevel) Category

func (l LogLevel) Category() string

Category 返回级别的类别

func (LogLevel) Color

func (l LogLevel) Color() string

Color 返回日志级别的颜色代码

func (LogLevel) Description

func (l LogLevel) Description() string

Description 返回级别的描述

func (LogLevel) Emoji

func (l LogLevel) Emoji() string

Emoji 返回日志级别的emoji

func (LogLevel) Info

func (l LogLevel) Info() LevelInfo

Info 返回级别的完整信息

func (LogLevel) IsApplication

func (l LogLevel) IsApplication() bool

IsApplication 检查是否为应用级别

func (LogLevel) IsBasic

func (l LogLevel) IsBasic() bool

IsBasic 检查是否为基础级别

func (LogLevel) IsBusiness

func (l LogLevel) IsBusiness() bool

IsBusiness 检查是否为业务级别

func (LogLevel) IsEnabled

func (l LogLevel) IsEnabled(target LogLevel) bool

IsEnabled 检查当前级别是否启用目标级别

func (LogLevel) IsPerformance

func (l LogLevel) IsPerformance() bool

IsPerformance 检查是否为性能级别

func (LogLevel) IsSecurity

func (l LogLevel) IsSecurity() bool

IsSecurity 检查是否为安全级别

func (LogLevel) IsSystem

func (l LogLevel) IsSystem() bool

IsSystem 检查是否为系统级别

func (LogLevel) IsValid

func (l LogLevel) IsValid() bool

IsValid 检查级别是否有效

func (LogLevel) MarshalText

func (l LogLevel) MarshalText() ([]byte, error)

MarshalText 实现文本序列化(用于 JSON 等)

func (LogLevel) Priority

func (l LogLevel) Priority() int

Priority 返回级别的优先级

func (LogLevel) ShortString

func (l LogLevel) ShortString() string

ShortString 返回级别的短字符串表示

func (LogLevel) String

func (l LogLevel) String() string

String 返回日志级别的字符串表示

func (*LogLevel) UnmarshalText

func (l *LogLevel) UnmarshalText(text []byte) error

UnmarshalText 实现文本反序列化(用于 JSON 等)

func (*LogLevel) UnmarshalYAML

func (l *LogLevel) UnmarshalYAML(unmarshal func(interface{}) error) error

UnmarshalYAML 实现 YAML 反序列化,支持字符串和整数值

type Logger

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

Logger 主要的日志记录器结构体

func GetGlobalLogger

func GetGlobalLogger() *Logger

GetGlobalLogger 获取全局Logger

func New

func New() *Logger

New 创建新的日志记录器(简化版本)

func NewLogger

func NewLogger() *Logger

NewLogger 创建新的日志记录器(默认配置)

默认输出为共享的 stdout 异步批量输出器(见 stdout.go 的成本实测与权衡), 而非裸 os.Stdout:后者每条日志一次 syscall + 一次互斥,占全链路 85~97% 的成本 异步语义要求优雅退出时调用 Flush();需要逐条立即落盘时用 WithOutput(os.Stdout) 退回裸流

着色默认随输出目标自动判定(终端开、重定向关),不再无条件开启

func (*Logger) Audit

func (l *Logger) Audit(action, user, resource, result string)

Audit 审计日志(AUDIT 级别)

func (*Logger) Cache

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

Cache 缓存日志(INFO 级别)

func (*Logger) Clone

func (l *Logger) Clone() ILogger

func (*Logger) ConfigLog

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

ConfigLog 配置日志(INFO 级别)

func (*Logger) ConsoleGroup

func (l *Logger) ConsoleGroup(label string, args ...any)

ConsoleGroup 开始一个新的日志分组

func (*Logger) ConsoleGroupCollapsed

func (l *Logger) ConsoleGroupCollapsed(label string, args ...any)

ConsoleGroupCollapsed 开始一个折叠的日志分组

func (*Logger) ConsoleGroupEnd

func (l *Logger) ConsoleGroupEnd()

ConsoleGroupEnd 结束当前分组

func (*Logger) ConsoleTable

func (l *Logger) ConsoleTable(data any)

ConsoleTable 显示表格

func (*Logger) ConsoleTime

func (l *Logger) ConsoleTime(label string) *Timer

ConsoleTime 开始计时

func (*Logger) Database

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

Database 数据库日志(INFO 级别)

func (*Logger) Debug

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

Debug 调试日志

func (*Logger) DebugContext

func (l *Logger) DebugContext(ctx context.Context, format string, args ...any)

带上下文的日志方法

func (*Logger) DebugContextKV

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

func (*Logger) DebugContextLines

func (l *Logger) DebugContextLines(ctx context.Context, lines ...string)

多行日志方法(带上下文)

func (*Logger) DebugCtxReturn

func (l *Logger) DebugCtxReturn(ctx context.Context, format string, args ...any) error

DebugCtxReturn 记录带上下文的调试日志并返回格式化的错误

func (*Logger) DebugKV

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

结构化日志方法(键值对)

func (*Logger) DebugKVReturn

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

DebugKVReturn 记录带键值对的调试日志并返回错误

func (*Logger) DebugLines

func (l *Logger) DebugLines(lines ...string)

func (*Logger) DebugMsg

func (l *Logger) DebugMsg(msg string)

纯文本日志方法

func (*Logger) DebugReturn

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

DebugReturn 记录调试日志并返回格式化的错误

func (*Logger) DebugWithFields

func (l *Logger) DebugWithFields(msg string, fields map[string]any)

字段映射方法(直接支持 map[string]any)

func (*Logger) Debugf

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

Printf风格方法(与上面相同,但命名更明确)

func (*Logger) Env

func (l *Logger) Env() string

Env 返回已配置的部署环境

func (*Logger) Environment

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

Environment 环境日志(INFO 级别)

func (*Logger) Error

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

Error 错误日志

func (*Logger) ErrorContext

func (l *Logger) ErrorContext(ctx context.Context, format string, args ...any)

func (*Logger) ErrorContextKV

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

func (*Logger) ErrorContextLines

func (l *Logger) ErrorContextLines(ctx context.Context, lines ...string)

func (*Logger) ErrorCtxReturn

func (l *Logger) ErrorCtxReturn(ctx context.Context, format string, args ...any) error

ErrorCtxReturn 记录带上下文的错误日志并返回格式化的错误

func (*Logger) ErrorKV

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

func (*Logger) ErrorKVReturn

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

ErrorKVReturn 记录带键值对的错误日志并返回错误

func (*Logger) ErrorLines

func (l *Logger) ErrorLines(lines ...string)

func (*Logger) ErrorMsg

func (l *Logger) ErrorMsg(msg string)

func (*Logger) ErrorReturn

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

ErrorReturn 记录错误日志并返回格式化的错误

func (*Logger) ErrorWithFields

func (l *Logger) ErrorWithFields(msg string, fields map[string]any)

func (*Logger) Errorf

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

func (*Logger) Fatal

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

Fatal 致命错误日志

func (*Logger) FatalContext

func (l *Logger) FatalContext(ctx context.Context, format string, args ...any)

func (*Logger) FatalContextKV

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

func (*Logger) FatalKV

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

func (*Logger) FatalMsg

func (l *Logger) FatalMsg(msg string)

func (*Logger) FatalWithFields

func (l *Logger) FatalWithFields(msg string, fields map[string]any)

func (*Logger) Fatalf

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

func (*Logger) Flush

func (l *Logger) Flush() error

Flush 刷新输出目标中缓冲的日志条目 异步输出器(控制台批量管道)在优雅退出链路中调用此方法, 确保 SIGTERM/SIGINT 时队列中的日志不丢失

func (*Logger) GetContextExtractor

func (l *Logger) GetContextExtractor() ContextExtractor

GetContextExtractor 获取当前的上下文提取器

func (*Logger) GetLevel

func (l *Logger) GetLevel() LogLevel

GetLevel 获取当前日志级别

func (*Logger) Health

func (l *Logger) Health(service string, status bool, details string)

Health 健康检查日志(WARN 级别用于不健康,INFO 级别用于健康)

func (*Logger) Info

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

Info 信息日志

func (*Logger) InfoContext

func (l *Logger) InfoContext(ctx context.Context, format string, args ...any)

func (*Logger) InfoContextKV

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

func (*Logger) InfoContextLines

func (l *Logger) InfoContextLines(ctx context.Context, lines ...string)

func (*Logger) InfoCtxReturn

func (l *Logger) InfoCtxReturn(ctx context.Context, format string, args ...any) error

InfoCtxReturn 记录带上下文的信息日志并返回格式化的错误

func (*Logger) InfoKV

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

func (*Logger) InfoKVReturn

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

InfoKVReturn 记录带键值对的信息日志并返回错误

func (*Logger) InfoLines

func (l *Logger) InfoLines(lines ...string)

多行日志方法 - 自动处理换行符

func (*Logger) InfoMsg

func (l *Logger) InfoMsg(msg string)

func (*Logger) InfoReturn

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

InfoReturn 记录信息日志并返回格式化的错误

func (*Logger) InfoWithFields

func (l *Logger) InfoWithFields(msg string, fields map[string]any)

func (*Logger) Infof

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

func (*Logger) Instance

func (l *Logger) Instance() string

Instance 返回已配置的实例标识

func (*Logger) IsLevelEnabled

func (l *Logger) IsLevelEnabled(level LogLevel) bool

IsLevelEnabled 检查给定级别是否启用

func (*Logger) IsShowCaller

func (l *Logger) IsShowCaller() bool

IsShowCaller 检查是否显示调用者信息

func (*Logger) Loading

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

Loading 加载日志(INFO 级别)

func (*Logger) Log

func (l *Logger) Log(level LogLevel, msg string)

原始日志条目方法

func (*Logger) LogContext

func (l *Logger) LogContext(ctx context.Context, level LogLevel, msg string)

func (*Logger) LogKV

func (l *Logger) LogKV(level LogLevel, msg string, keysAndValues ...any)

func (*Logger) LogSpecialContext

func (l *Logger) LogSpecialContext(ctx context.Context, logType SpecialLogType, level LogLevel, format string, args ...any)

LogSpecialContext 记录带上下文的特殊类型日志(公开方法)

使用示例:

logger.LogSpecialContext(ctx, SuccessType, INFO, "操作成功")
logger.LogSpecialContext(ctx, DatabaseType, INFO, "查询 %s 耗时 %v", table, duration)
logger.LogSpecialContext(ctx, SecurityType, SECURITY, "检测到异常访问 %s", ip)

JSON 模式:ctx 字段提取到 JSON fields;text 模式:ctx 信息前缀到消息

func (*Logger) LogWithFields

func (l *Logger) LogWithFields(level LogLevel, msg string, fields map[string]any)

func (*Logger) Milestone

func (l *Logger) Milestone(message string)

Milestone 里程碑日志(INFO 级别)

func (*Logger) Network

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

Network 网络日志(INFO 级别)

func (*Logger) NewConsoleGroup

func (l *Logger) NewConsoleGroup() *ConsoleGroup

NewConsoleGroup 创建新的控制台分组 继承 logger 的 output(可能是 buffer/stdout/文件),但不走 logger 格式化

func (*Logger) Performance

func (l *Logger) Performance(operation string, duration time.Duration, details ...map[string]any)

Performance 性能日志(PERFORMANCE 级别,支持可选的详细信息)

func (*Logger) Print

func (l *Logger) Print(args ...any)

兼容标准log包的方法

func (*Logger) Printf

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

func (*Logger) Println

func (l *Logger) Println(args ...any)

func (*Logger) Progress

func (l *Logger) Progress(current, total int, operation string)

Progress 进度日志(INFO 级别)

func (*Logger) Security

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

Security 安全日志(SECURITY 级别)

func (*Logger) Service

func (l *Logger) Service() string

Service 返回已配置的服务名

func (*Logger) SetContextExtractor

func (l *Logger) SetContextExtractor(extractor ContextExtractor)

SetContextExtractor 设置自定义上下文提取器

func (*Logger) SetLevel

func (l *Logger) SetLevel(level LogLevel)

SetLevel 设置日志级别

func (*Logger) SetShowCaller

func (l *Logger) SetShowCaller(show bool)

SetShowCaller 设置是否显示调用者信息

func (*Logger) Start

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

Start 启动日志(INFO 级别)

func (*Logger) StartTiming

func (l *Logger) StartTiming(operation string) *Timing

StartTiming 开始计时

func (*Logger) Stop

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

Stop 停止日志(INFO 级别)

func (*Logger) Success

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

Success 成功日志(INFO 级别)

func (*Logger) Warn

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

Warn 警告日志

func (*Logger) WarnContext

func (l *Logger) WarnContext(ctx context.Context, format string, args ...any)

func (*Logger) WarnContextKV

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

func (*Logger) WarnContextLines

func (l *Logger) WarnContextLines(ctx context.Context, lines ...string)

func (*Logger) WarnCtxReturn

func (l *Logger) WarnCtxReturn(ctx context.Context, format string, args ...any) error

WarnCtxReturn 记录带上下文的警告日志并返回格式化的错误

func (*Logger) WarnKV

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

func (*Logger) WarnKVReturn

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

WarnKVReturn 记录带键值对的警告日志并返回错误

func (*Logger) WarnLines

func (l *Logger) WarnLines(lines ...string)

func (*Logger) WarnMsg

func (l *Logger) WarnMsg(msg string)

func (*Logger) WarnReturn

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

WarnReturn 记录警告日志并返回格式化的错误

func (*Logger) WarnWithFields

func (l *Logger) WarnWithFields(msg string, fields map[string]any)

func (*Logger) Warnf

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

func (*Logger) WithCallerDepth

func (l *Logger) WithCallerDepth(depth int) *Logger

WithCallerDepth 设置调用者深度

func (*Logger) WithCallerKey

func (l *Logger) WithCallerKey(key string) *Logger

WithCallerKey 设置调用者字段名

func (*Logger) WithColorful

func (l *Logger) WithColorful(colorful bool) *Logger

WithColorful 设置是否使用彩色输出 显式调用后不再随输出目标自动判定,始终尊重此处的选择

func (*Logger) WithContext

func (l *Logger) WithContext(ctx context.Context) ILogger

WithContext 带上下文的logger(当前实现返回自身)

func (*Logger) WithContextExtractor

func (l *Logger) WithContextExtractor(extractor ContextExtractor) *Logger

WithContextExtractor 设置上下文提取器

func (*Logger) WithContextKeys

func (l *Logger) WithContextKeys(keys ...string) *Logger

WithContextKeys 配置 Logger 在记录 Context 日志时提取哪些 key

func (*Logger) WithEnv

func (l *Logger) WithEnv(env string) *Logger

WithEnv 设置部署环境(输出为 env 字段,如 prod / staging / dev)

func (*Logger) WithError

func (l *Logger) WithError(err error) ILogger

WithError 添加错误信息

func (*Logger) WithField

func (l *Logger) WithField(key string, value any) ILogger

WithField 添加字段信息(结构化日志) 字段在此处一次性预编码,子 Logger 后续每条日志只做一次 memcpy(见 fields.go)

func (*Logger) WithFields

func (l *Logger) WithFields(fields map[string]any) ILogger

WithFields 添加多个字段信息(结构化日志) 字段按键排序后预编码,保证同一子 Logger 打出的 JSON 字段顺序稳定

func (*Logger) WithFormat

func (l *Logger) WithFormat(format FormatType) *Logger

WithFormat 设置输出格式

func (*Logger) WithFormatter

func (l *Logger) WithFormatter(formatter IFormatter) *Logger

WithFormatter 设置格式化器

func (*Logger) WithHooks

func (l *Logger) WithHooks(hooks []IHook) *Logger

WithHooks 设置钩子列表

func (*Logger) WithInstance

func (l *Logger) WithInstance(instance string) *Logger

WithInstance 设置实例标识(输出为 instance 字段) 传空串表示按 INSTANCE_ID / POD_NAME / HOSTNAME 依次推导,都取不到时回落到主机名

func (*Logger) WithLevel

func (l *Logger) WithLevel(level LogLevel) *Logger

WithLevel 设置日志级别

func (*Logger) WithLevelKey

func (l *Logger) WithLevelKey(key string) *Logger

WithLevelKey 设置日志级别字段名

func (*Logger) WithMaxFieldBytes

func (l *Logger) WithMaxFieldBytes(max int) *Logger

WithMaxFieldBytes 设置单个字段值的字节上限,<=0 表示不限制(默认)

默认不限制:通用日志库静默截断调用方的数据是意外行为,应由调用方按业务 明确选择。整行上限(默认开启)已能兜住失控的大 payload

func (*Logger) WithMaxLineBytes

func (l *Logger) WithMaxLineBytes(max int) *Logger

WithMaxLineBytes 设置单条日志的字节上限,<=0 表示不限制 上限不含末尾换行;超限时条目会补 truncated 标记

func (*Logger) WithMessageKey

func (l *Logger) WithMessageKey(key string) *Logger

WithMessageKey 设置消息字段名

func (*Logger) WithMiddleware

func (l *Logger) WithMiddleware(middleware []IMiddleware) *Logger

WithMiddleware 设置中间件列表

func (*Logger) WithOutput

func (l *Logger) WithOutput(output io.Writer) *Logger

WithOutput 设置输出目标

output 原样使用,不做缓冲/异步包装:需要高吞吐时传入内置输出器 (NewConsoleWriter / NewFileWriter / NewRotateWriter / DefaultOutput), 传入裸 os.Stdout 或 *os.File 即明确选择"逐条立即落盘"的同步语义

未显式调用过 WithColorful 时,着色随新目标的能力重新判定

func (*Logger) WithPrefix

func (l *Logger) WithPrefix(prefix string) *Logger

WithPrefix 设置日志前缀

func (*Logger) WithSanitize

func (l *Logger) WithSanitize(mode SanitizeMode) *Logger

WithSanitize 设置脱敏强度(默认 SanitizeKeys)

func (*Logger) WithService

func (l *Logger) WithService(service string) *Logger

WithService 设置服务名(输出为 service 字段)

func (*Logger) WithShowCaller

func (l *Logger) WithShowCaller(show bool) *Logger

WithShowCaller 设置是否显示调用者信息

func (*Logger) WithShowStacktrace

func (l *Logger) WithShowStacktrace(show bool) *Logger

WithShowStacktrace 设置是否显示堆栈跟踪

func (*Logger) WithStacktraceKey

func (l *Logger) WithStacktraceKey(key string) *Logger

WithStacktraceKey 设置堆栈跟踪字段名

func (*Logger) WithTimeFormat

func (l *Logger) WithTimeFormat(format string) *Logger

WithTimeFormat 设置时间格式

func (*Logger) WithTimestampKey

func (l *Logger) WithTimestampKey(key string) *Logger

WithTimestampKey 设置时间戳字段名(条目首字段,片段不带前导逗号)

func (*Logger) WithWriters

func (l *Logger) WithWriters(writers []IWriter) *Logger

WithWriters 设置写入器列表

type LoggerStats

type LoggerStats struct {
	StartTime    time.Time          `json:"start_time"`
	TotalLogs    int64              `json:"total_logs"`
	LevelCounts  map[LogLevel]int64 `json:"level_counts"`
	ErrorCount   int64              `json:"error_count"`
	LastLogTime  time.Time          `json:"last_log_time"`
	Uptime       time.Duration      `json:"uptime"`
	BytesWritten int64              `json:"bytes_written"`
	// contains filtered or unexported fields
}

LoggerStats 日志统计信息

func NewLoggerStats

func NewLoggerStats() *LoggerStats

NewLoggerStats 创建新的统计信息

func (*LoggerStats) AddBytes

func (s *LoggerStats) AddBytes(bytes int64)

AddBytes 增加字节数

func (*LoggerStats) GetStats

func (s *LoggerStats) GetStats() *LoggerStats

GetStats 获取统计信息快照

func (*LoggerStats) IncrementLevel

func (s *LoggerStats) IncrementLevel(level LogLevel)

IncrementLevel 增加级别计数

type MultiLogWriter

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

MultiLogWriter 多输出器(同时写入多个输出器,实现日志分发)

func (*MultiLogWriter) Close

func (w *MultiLogWriter) Close() error

Close 关闭所有输出器

func (*MultiLogWriter) Flush

func (w *MultiLogWriter) Flush() error

Flush 刷新所有输出器

func (*MultiLogWriter) GetStats

func (w *MultiLogWriter) GetStats() WriterStatsSnapshot

GetStats 获取统计信息

func (*MultiLogWriter) IsHealthy

func (w *MultiLogWriter) IsHealthy() bool

IsHealthy 检查是否至少有一个输出器健康

func (*MultiLogWriter) Write

func (w *MultiLogWriter) Write(p []byte) (n int, err error)

Write 实现io.Writer接口

func (*MultiLogWriter) WriteLevel

func (w *MultiLogWriter) WriteLevel(level LogLevel, data []byte) (n int, err error)

WriteLevel 按级别写入

type MultiWriterOption

type MultiWriterOption func(*MultiLogWriter)

MultiWriterOption 多输出器配置选项

func WithMultiLevel

func WithMultiLevel(level LogLevel) MultiWriterOption

WithMultiLevel 设置日志级别

func WithWriters

func WithWriters(writers ...IWriter) MultiWriterOption

WithWriters 设置输出器列表

type OutputType

type OutputType string

OutputType 输出类型

const (
	OutputConsole OutputType = "console" // 控制台输出
	OutputFile    OutputType = "file"    // 文件输出
	OutputRotate  OutputType = "rotate"  // 轮转文件输出
	OutputStdout  OutputType = "stdout"  // 标准输出
	OutputStderr  OutputType = "stderr"  // 标准错误输出
)

type PerformanceLevel

type PerformanceLevel struct {
	Threshold time.Duration
	Emoji     string
	Level     string
}

PerformanceLevel 性能级别定义

type RotateLogWriter

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

RotateLogWriter 轮转文件输出器(支持按大小自动轮转,支持可配置缓冲区)

func (*RotateLogWriter) Close

func (w *RotateLogWriter) Close() error

Close 关闭输出器(确保缓冲刷新)

func (*RotateLogWriter) Flush

func (w *RotateLogWriter) Flush() error

Flush 刷新缓冲区(刷新缓冲和文件)

func (*RotateLogWriter) GetStats

func (w *RotateLogWriter) GetStats() WriterStatsSnapshot

GetStats 获取统计信息

func (*RotateLogWriter) IsHealthy

func (w *RotateLogWriter) IsHealthy() bool

IsHealthy 检查健康状态(使用 atomic 快速检查)

func (*RotateLogWriter) Write

func (w *RotateLogWriter) Write(p []byte) (n int, err error)

Write 实现io.Writer接口(写入缓冲区)

func (*RotateLogWriter) WriteLevel

func (w *RotateLogWriter) WriteLevel(level LogLevel, data []byte) (n int, err error)

WriteLevel 按级别写入

type RotateWriterOption

type RotateWriterOption func(*RotateLogWriter)

RotateWriterOption 轮转文件输出器配置选项

func WithCompress

func WithCompress(compress bool) RotateWriterOption

WithCompress 设置是否压缩旧文件

func WithFilePath

func WithFilePath(filePath string) RotateWriterOption

WithFilePath 设置文件路径

func WithMaxAge

func WithMaxAge(maxAge time.Duration) RotateWriterOption

WithMaxAge 设置最大保留时间

func WithMaxFiles

func WithMaxFiles(maxFiles int) RotateWriterOption

WithMaxFiles 设置最大文件数

func WithMaxSize

func WithMaxSize(maxSize int64) RotateWriterOption

WithMaxSize 设置最大文件大小(字节)

func WithRotateBufferSize

func WithRotateBufferSize(size int) RotateWriterOption

WithRotateBufferSize 设置缓冲区大小(字节)

func WithRotateLevel

func WithRotateLevel(level LogLevel) RotateWriterOption

WithRotateLevel 设置日志级别

func WithRotatePermission

func WithRotatePermission(permission os.FileMode) RotateWriterOption

WithRotatePermission 设置文件权限

type SanitizeMode

type SanitizeMode int32

SanitizeMode 脱敏强度

const (
	// SanitizeOff 关闭脱敏
	SanitizeOff SanitizeMode = iota

	// SanitizeKeys 仅按字段名脱敏(默认)
	//
	// 判定全程零分配:规范 snake_case 字段名一次查表命中,非规范形态由后缀扫描
	// 边归一化边比较,两者都落空才退回栈上缓冲做一次完整归一化后重查
	// 不读取值内容,因此既不会误伤业务正文,成本也不随消息长度增加
	SanitizeKeys

	// SanitizeKeysAndValues 字段名 + 值内容扫描
	//
	// 额外在 msg 与各字段值里查找凭据、JWT、邮箱、手机号与带签名的私有链接
	// 代价是每条日志都要扫一遍文本,且业务正文可能被误伤(如长订单号被当成手机号),故不作为默认值
	SanitizeKeysAndValues
)

type SpecialLogType

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

SpecialLogType 特殊日志类型

type Timer

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

Timer 计时器 输出直接写入 output(默认 os.Stdout),不走 logger 格式化

func NewTimer

func NewTimer(output io.Writer, label string, indentLevel int) *Timer

NewTimer 创建新的计时器 output 为输出目标,传入 nil 则使用 os.Stdout 注意:如果多个 Timer 共享同一个 io.Writer,该 Writer 必须是线程安全的(如 os.Stdout)

func (*Timer) Elapsed

func (t *Timer) Elapsed() time.Duration

Elapsed 获取已经过的时间(不输出日志)

func (*Timer) End

func (t *Timer) End() time.Duration

End 结束计时并输出耗时 类似 JavaScript console.timeEnd()

func (*Timer) Log

func (t *Timer) Log(msg string, args ...interface{}) time.Duration

Log 输出当前耗时(不结束计时) 类似 JavaScript console.timeLog()

type Timing

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

Timing 计时器辅助结构

func (*Timing) AddDetail

func (t *Timing) AddDetail(key string, value any) *Timing

AddDetail 添加详细信息

func (*Timing) End

func (t *Timing) End() time.Duration

End 结束计时并记录性能日志

type WriterConfig

type WriterConfig struct {
	Type       OutputType  `json:"type" yaml:"type"`               // 输出类型
	FilePath   string      `json:"file_path" yaml:"file_path"`     // 文件路径
	MaxSize    int64       `json:"max_size" yaml:"max_size"`       // 最大文件大小(字节)
	MaxFiles   int         `json:"max_files" yaml:"max_files"`     // 最大文件数
	MaxAge     int         `json:"max_age" yaml:"max_age"`         // 最大保存天数
	Compress   bool        `json:"compress" yaml:"compress"`       // 是否压缩
	Permission os.FileMode `json:"permission" yaml:"permission"`   // 文件权限
	BufferSize int         `json:"buffer_size" yaml:"buffer_size"` // 缓冲区大小
	Output     io.Writer   `json:"-" yaml:"-"`                     // 自定义输出
}

WriterConfig Writer 配置

type WriterStatsSnapshot

type WriterStatsSnapshot struct {
	BytesWritten int64         `json:"bytes_written"` // 已写入字节总数
	LinesWritten int64         `json:"lines_written"` // 已写入行数总数
	ErrorCount   int64         `json:"error_count"`   // 错误次数总数
	LastWrite    time.Time     `json:"last_write"`    // 最后一次写入时间
	StartTime    time.Time     `json:"start_time"`    // 输出器启动时间
	Uptime       time.Duration `json:"uptime"`        // 运行时长
}

WriterStatsSnapshot 统计信息快照(用于外部访问的只读数据)

Jump to

Keyboard shortcuts

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