Golang原生提供log包,但功能有限(仅支持基本日志输出、无级别控制)。生产环境推荐使用第三方高性能日志库:
go get命令安装(如go get github.com/sirupsen/logrus)。SetOutput方法将日志输出到控制台(默认)、文件或远程系统日志(如rsyslog)。例如,输出到文件:file, err := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("Failed to open log file:", err)
}
logrus.SetOutput(file) // 或zap.New().WithOptions(zap.AddWriter(file))
logrus.SetFormatter(&logrus.JSONFormatter{})
zap默认输出JSON格式,可通过zap.NewProduction()快速启用。使用lumberjack库(go get gopkg.in/natefinch/lumberjack.v2)实现日志自动轮转,配置参数包括:
Filename:日志文件路径;MaxSize:单个文件最大大小(MB);MaxBackups:保留的旧日志文件数量;MaxAge:日志保留天数;Compress:是否压缩旧日志。示例代码:
logrus.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log",
MaxSize: 10, // 10MB
MaxBackups: 3, // 保留3个旧文件
MaxAge: 28, // 保留28天
Compress: true, // 压缩旧文件
})
lumberjack会自动处理日志切割和清理,无需手动干预。
将Golang日志发送到系统日志工具(如rsyslog、journalctl),实现集中收集与管理:
/etc/rsyslog.conf,启用TCP/UDP接收(ModLoad imudp; UDPPort 514;ModLoad imtcp; TCPPort 514),重启服务(systemctl restart rsyslog);log/syslog包或第三方库(如github.com/RackSec/srslog)将日志发送到rsyslog,再通过rsyslog转发到远程服务器或日志平台(如ELK)。journalctl -u your-golang-service查看系统日志,或journalctl -n 100查看最近100条日志。通过日志库的SetLevel方法设置日志级别,过滤无关日志,提升日志效率:
DebugLevel、InfoLevel、WarnLevel、ErrorLevel、FatalLevel等;zapcore.Level设置(如zap.NewProduction()默认InfoLevel)。示例(logrus):
logrus.SetLevel(logrus.InfoLevel) // 仅输出Info及以上级别日志
logrus.Debug("This debug log will not be output") // 不会输出
logrus.Info("This info log will be output") // 会输出
cron(crontab -e)添加定时任务,定期压缩或删除旧日志。例如,每天凌晨1点清理7天前的日志:0 1 * * * find /var/log/myapp.log* -type f -name "*.log" -mtime +7 -exec gzip {} \; && find /var/log/myapp.log* -type f -name "*.log.gz" -mtime +7 -exec rm {} \;
tail -f /var/log/myapp.log实时查看日志,或使用multitail(yum install multitail)同时监控多个日志文件:multitail /var/log/myapp.log*
使用Supervisor(yum install supervisor)管理Golang进程,确保服务崩溃后自动重启,并将日志输出到指定文件:
/etc/supervisord.d/myapp.ini):[program:myapp]
directory=/path/to/your/app
command=/path/to/your/app/main
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
environment=ENV_VAR=value
systemctl start supervisord,并通过supervisorctl status查看进程状态。