选择合适的日志库是基础,需根据性能、功能需求决定:
log:简单易用,适合小型项目或基础日志记录,但功能有限(仅支持文本格式、无结构化支持)。zap(Uber开源):高性能、结构化日志(支持JSON格式),适合对性能要求高的场景(如微服务、高频请求应用);logrus:功能丰富(支持结构化日志、钩子机制),社区生态好,适合需要灵活配置的项目;slog(Go 1.21+官方库):统一日志接口,减少第三方依赖,适合新项目或追求标准化的场景。go-logr/logr:提供抽象接口,方便切换不同日志实现(如zap、logrus),提高代码可维护性。合理选择输出目标,兼顾实时性与持久性:
/var/log/myapp.log),并配置权限(如0640,避免未授权访问)。防止日志文件过大占用磁盘空间,需通过工具或库实现自动轮转:
logrotate:Linux自带,通过配置文件(如/etc/logrotate.d/myapp)实现:/path/to/your/golang/app/logs/*.log {
daily # 每天轮转
rotate 7 # 保留7份旧日志
compress # 压缩旧日志(如gzip)
missingok # 日志不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root root # 新日志文件权限与所属
}
lumberjack:轻量级第三方库,无需修改系统配置,直接集成到应用中:import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志路径
MaxSize: 10, // 单个文件最大10MB
MaxBackups: 7, // 保留7个备份
MaxAge: 30, // 保留30天
Compress: true, // 压缩旧日志
})
两者对比:logrotate适合系统级统一管理,lumberjack适合应用内嵌(部署更简单)。通过级别控制日志详细程度,减少不必要的IO消耗:
DEBUG(调试)、INFO(常规信息)、WARN(警告)、ERROR(错误)、FATAL(致命,需终止程序)。zap:通过ProductionConfig()设置默认级别(InfoLevel),或动态调整;logrus:使用SetLevel(logrus.InfoLevel)设置;INFO及以上,避免DEBUG日志过多影响性能。采用结构化格式(如JSON)记录日志,提升可分析性:
zap:默认输出JSON格式,可通过zap.String、zap.Int等添加字段;logrus:使用WithFields方法添加结构化字段;zap):logger.Info("User login",
zap.String("username", "admin"),
zap.String("ip", "192.168.1.1"),
)
{"level":"info","ts":1698600000,"msg":"User login","username":"admin","ip":"192.168.1.1"}。在微服务架构中,需将各节点日志汇总至集中式平台,实现统一管理:
zap的HTTPHandler或logrus的钩子(Hook)将日志发送到远程后端(如Logstash的TCP/UDP接口)。针对高并发场景,优化日志记录性能,避免成为系统瓶颈:
zap的AsyncCore),减少IO阻塞;tmpfs(内存文件系统),性能比磁盘高100倍以上,定期将日志同步到磁盘;DEBUG日志,减少不必要的日志输出。保障日志数据的安全性与可观测性:
0640),仅允许授权用户访问;Prometheus+Grafana监控日志产生频率、错误日志数量等指标;