在Ubuntu环境下配置Golang日志的第一步是选择合适的日志库,需根据项目规模、性能需求及功能复杂度决定:
log:适合小型项目或初学者,提供基础的Println、Printf等方法,支持设置输出前缀(如INFO:)和日志格式(时间、文件名),但功能有限(无日志级别、结构化输出)。caller、stacktrace),但API较底层。logrus-json)。以zap和logrus为例,通过go get安装:
go get -u go.uber.org/zap # 安装zap
go get github.com/sirupsen/logrus # 安装logrus
日志级别用于过滤不必要的日志,常见级别:Debug(调试)、Info(信息)、Warn(警告)、Error(错误)。示例:
config := zap.NewProductionConfig()
config.Level = zap.NewAtomicLevelAt(zap.InfoLevel) // 设置为Info级别
logger, _ := config.Build()
logrus.SetLevel(logrus.InfoLevel) // 设置为Info级别
可将日志输出到控制台(开发环境)或文件(生产环境):
config.OutputPaths = []string{"stdout"} // 输出到标准输出
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
logrus.SetOutput(file) // 输出到文件
结构化日志(如JSON)更易被监控工具解析,示例:
config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // ISO8601时间格式
config.EncoderConfig.EncodeLevel = zapcore.LowercaseLevelEncoder // 小写级别
logger, _ := config.Build()
logger.Info("User logged in", zap.String("username", "admin")) // 添加字段
logrus.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
logrus.WithFields(logrus.Fields{
"username": "admin",
}).Info("User logged in")
防止日志文件过大,可使用Lumberjack库(与zap/logrus集成)或系统工具**logrotate`:
import "gopkg.in/natefinch/lumberjack.v2"
writer := &lumberjack.Logger{
Filename: "/var/log/myapp/app.log", // 日志文件路径
MaxSize: 100, // 单个文件最大100MB
MaxBackups: 5, // 保留5个备份
MaxAge: 30, // 保留30天
Compress: true, // 压缩旧日志
}
core := zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
zapcore.AddSync(writer),
zap.InfoLevel,
)
logger := zap.New(core)
/etc/logrotate.d/myapp配置文件:/var/log/myapp/*.log {
daily # 每天轮转
rotate 7 # 保留7天
missingok # 文件不存在不报错
notifempty # 文件为空不轮转
compress # 压缩旧日志
delaycompress # 延迟压缩(避免影响当前日志)
postrotate # 轮转后执行命令(如重启应用)
systemctl restart myapp.service
endscript
}
避免日志写入阻塞主流程,可使用law库(适配zap/logrus/zerolog):
import "github.com/qiniu/logkit/law"
func main() {
logger := zap.NewExample() // 初始化zap logger
asyncLogger := law.NewAsync(logger, law.WithWorkerNum(5)) // 5个worker协程
asyncLogger.Info("Async log message") // 异步写入
}
将Golang日志与监控工具集成,实现日志分析、报警:
zap或zerolog(高性能),启用结构化日志(JSON),配置日志轮转(避免磁盘爆满)。zap时,务必调用defer logger.Sync()(刷新缓冲区);logrus无需额外处理。