go日志库

go日志库


一.📌 Go zap 日志速查表

1. 安装

1
go get go.uber.org/zap

2. 创建 Logger

1
2
3
logger, _ := zap.NewDevelopment() // 开发模式 (console, 带颜色)
logger, _ := zap.NewProduction() // 生产模式 (JSON, 适合采集)
defer logger.Sync()

3. 两种 Logger

1
2
sugar := logger.Sugar()    // 语法糖,易用
logger.Info("严格模式日志") // 强类型,性能好

4. 日志级别(从低到高)

zap 默认 日志级别过滤机制:低于设定级别的日志不会输出。

方法 说明
Debug 调试日志
Info 信息日志
Warn 警告
Error 错误
DPanic 开发模式 panic
Panic 记录并 panic
Fatal 记录并退出程序

5. Sugared Logger 用法

1
2
sugar.Infof("用户 %s 登录, id=%d", "tom", 123)
sugar.Warnw("认证失败", "user", "tom", "attempt", 3)

6. Logger(结构化日志)

1
2
3
4
logger.Info("用户登录成功",
zap.String("user", "tom"),
zap.Int("id", 123),
)

输出(JSON 格式):

1
{"level":"info","ts":1695194700.12,"caller":"main.go:12","msg":"用户登录成功","user":"tom","id":123}

7. 带上下文日志

1
2
reqLogger := logger.With(zap.String("request_id", "abc-123"))
reqLogger.Info("请求开始")

8. 自定义配置

1
2
3
4
5
6
7
cfg := zap.Config{
Encoding: "json", // "json" / "console"
Level: zap.NewAtomicLevelAt(zap.DebugLevel),
OutputPaths: []string{"stdout", "app.log"},
EncoderConfig: zap.NewProductionEncoderConfig(),
}
logger, _ := cfg.Build()

9. 动态调整日志级别

1
2
3
level := zap.NewAtomicLevelAt(zap.InfoLevel)
logger, _ := zap.Config{Level: level}.Build()
level.SetLevel(zap.DebugLevel) // 动态切换

二.zap使用实例

👌 这是一个 完整的 zap 使用 demo,包含:

  • 日志初始化(带文件切割 lumberjack
  • 封装成 logger.go 工具包
  • main.go 中调用

这样你直接放到项目里就能用。


📂 项目结构

1
2
3
4
5
zap-demo/
├── go.mod
├── logger/
│ └── logger.go
└── main.go

🔹 logger/logger.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package logger

import (
"os"
"time"

"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)

var Logger *zap.Logger

// Init 初始化日志
func Init(logFile string, level zapcore.Level) {
// 日志切割配置
writeSyncer := zapcore.AddSync(&lumberjack.Logger{
Filename: logFile, // 日志文件路径
MaxSize: 10, // 单个文件最大 (MB)
MaxBackups: 5, // 保留旧文件个数
MaxAge: 30, // 保留天数
Compress: true, // 是否压缩
})

// 编码器配置
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder, // 日志级别小写
EncodeTime: zapcore.TimeEncoderOfLayout(time.RFC3339), // 时间格式
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}

// JSON 格式日志
encoder := zapcore.NewJSONEncoder(encoderConfig)

// 日志核心
core := zapcore.NewCore(encoder, writeSyncer, level)

// 创建 logger
Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
}

// 快捷函数
func Debug(msg string, fields ...zap.Field) {
Logger.Debug(msg, fields...)
}

func Info(msg string, fields ...zap.Field) {
Logger.Info(msg, fields...)
}

func Warn(msg string, fields ...zap.Field) {
Logger.Warn(msg, fields...)
}

func Error(msg string, fields ...zap.Field) {
Logger.Error(msg, fields...)
}

func Sync() {
_ = Logger.Sync()
}

🔹 main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"go.uber.org/zap"
"zap-demo/logger"
)

func main() {
// 初始化日志(写到 app.log 文件,日志级别 Info)
logger.Init("app.log", zap.InfoLevel)
defer logger.Sync()

// 输出不同级别日志
logger.Debug("这是一条调试日志") // 不会输出,因为级别是 Info
logger.Info("服务启动成功", zap.String("version", "1.0.0"))
logger.Warn("磁盘空间不足", zap.Int("remain", 5))
logger.Error("数据库连接失败", zap.String("db", "mysql"), zap.Int("port", 3306))

// 带上下文日志
reqLogger := logger.Logger.With(zap.String("request_id", "abc-123"))
reqLogger.Info("处理请求", zap.String("user", "tom"))
}

📌 运行效果

  1. 控制台输出 JSON 格式日志
  2. app.log 文件里自动写入日志
  3. 超过 10MB 自动切割,最多保留 5 个,旧日志压缩

日志内容示例:

1
2
3
{"level":"info","time":"2025-09-20T12:55:00+08:00","caller":"main.go:13","msg":"服务启动成功","version":"1.0.0"}
{"level":"warn","time":"2025-09-20T12:55:01+08:00","caller":"main.go:14","msg":"磁盘空间不足","remain":5}
{"level":"error","time":"2025-09-20T12:55:02+08:00","caller":"main.go:15","msg":"数据库连接失败","db":"mysql","port":3306}


三.📚 Go logrus 速查表

🔹 1. 安装

1
go get github.com/sirupsen/logrus

🔹 2. 日志级别

级别 方法 说明
Trace log.Trace(...) 追踪信息(最低级别)
Debug log.Debug(...) 调试信息
Info log.Info(...) 普通日志
Warn log.Warn(...) 警告
Error log.Error(...) 错误
Fatal log.Fatal(...) 记录并 os.Exit(1)
Panic log.Panic(...) 记录并触发 panic

👉 默认级别是 Info,低于此级别的日志不会输出。


🔹 3. 设置日志级别

1
logrus.SetLevel(logrus.DebugLevel)

🔹 4. 日志格式

1
2
logrus.SetFormatter(&logrus.TextFormatter{FullTimestamp: true}) // 默认,开发模式
logrus.SetFormatter(&logrus.JSONFormatter{}) // JSON 格式,生产推荐

🔹 5. 日志输出

1
2
3
logrus.SetOutput(os.Stdout) // 控制台
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
logrus.SetOutput(file) // 文件

🔹 6. 带字段日志(结构化)

1
2
3
4
5
logrus.WithField("user", "tom").Info("用户登录")
logrus.WithFields(logrus.Fields{
"id": 123,
"role": "admin",
}).Warn("权限不足")

输出示例(JSONFormatter):

1
2
{"level":"info","msg":"用户登录","time":"2025-09-20T13:30:00+08:00","user":"tom"}
{"id":123,"level":"warn","msg":"权限不足","role":"admin","time":"2025-09-20T13:30:01+08:00"}

🔹 7. 创建独立 Logger

1
2
3
4
logger := logrus.New()
logger.SetFormatter(&logrus.JSONFormatter{})
logger.SetLevel(logrus.DebugLevel)
logger.Info("独立 logger")

🔹 8. Hook 扩展(进阶)

logrus 支持 Hook,把日志写入:

  • Kafka / RabbitMQ
  • ELK / Graylog
  • Syslog / Fluentd

👉 第三方扩展库可用,例如 github.com/onrik/logrus/filename


🔹 9. 常见用法总结

1
2
3
4
5
6
7
8
9
logrus.Info("应用启动成功")
logrus.Warn("磁盘空间不足")
logrus.Error("数据库连接失败")

logrus.WithField("module", "auth").Info("用户认证中")
logrus.WithFields(logrus.Fields{
"ip": "127.0.0.1",
"id": 123,
}).Error("非法访问")

[up主专用,视频内嵌代码贴在这]