go日志库
一.📌 Go zap 日志速查表
1. 安装
2. 创建 Logger
1 2 3
| logger, _ := zap.NewDevelopment() logger, _ := zap.NewProduction() 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", 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
func Init(logFile string, level zapcore.Level) { writeSyncer := zapcore.AddSync(&lumberjack.Logger{ Filename: logFile, MaxSize: 10, 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, }
encoder := zapcore.NewJSONEncoder(encoderConfig)
core := zapcore.NewCore(encoder, writeSyncer, level)
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() { logger.Init("app.log", zap.InfoLevel) defer logger.Sync()
logger.Debug("这是一条调试日志") 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")) }
|
📌 运行效果
- 控制台输出 JSON 格式日志
app.log 文件里自动写入日志
- 超过 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{})
|
🔹 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主专用,视频内嵌代码贴在这]