Linux 下 Golang 日志管理实践
一 核心要点
二 日志库选择与对比
| 库 | 特点 | 典型场景 |
|---|---|---|
| log(标准库) | 简单、零依赖 | 学习/小型工具 |
| logrus | 结构化、插件多、API 友好 | 业务服务快速落地 |
| zap | 高性能、结构化、可深度定制 | 高并发/生产核心服务 |
| zerolog | 零分配、极致性能 | 对延迟敏感的服务 |
| slog(Go 1.21+) | 官方结构化日志、统一接口 | 希望减少第三方依赖 |
说明:上述库均支持日志级别、格式化与输出目标配置;在需要高性能与可观测性时,优先 zap/zerolog/slog。
三 快速上手示例
package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := logrus.New()
logger.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
logger.SetLevel(logrus.InfoLevel)
logger.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7, // 保留旧文件个数
MaxAge: 28, // 天
Compress: true, // 压缩
})
logger.WithFields(logrus.Fields{
"service": "order",
"trace_id": "abc-123",
}).Info("order created")
}
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
writeSyncer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100,
MaxBackups: 7,
MaxAge: 28,
Compress: true,
})
encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
core := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)
logger := zap.New(core, zap.AddCaller())
defer logger.Sync()
logger.Info("user login",
zap.String("user_id", "u1001"),
zap.String("ip", "192.168.1.10"))
}
提示:生产环境建议开启 logger.Sync() 或使用 AddSync 的 lumberjack 以确保关键日志落盘。
四 文件轮转与系统整合
五 性能与安全最佳实践