1. 选择合适的日志库
Golang标准库log提供基础日志功能,但功能有限。推荐使用结构化日志库提升日志可读性与可管理性:
2. 实现日志轮转(避免文件过大)
日志轮转是防止日志文件无限增长的关键,常用两种方式:
系统级工具:logrotate(推荐):
CentOS自带logrotate,可通过配置文件实现统一管理。创建/etc/logrotate.d/myapp文件,内容如下:
/path/to/your/app/*.log {
daily # 每天轮转
rotate 7 # 保留7份旧日志
compress # 压缩旧日志(gzip)
missingok # 日志不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root root # 新日志文件权限与属主
}
该配置会自动处理日志轮转,无需修改代码。
应用内集成:lumberjack(灵活):
通过github.com/natefinch/lumberjack库,在代码中直接控制日志轮转。示例:
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志路径
MaxSize: 10, // 单个文件最大10MB
MaxBackups: 5, // 保留5份备份
MaxAge: 30, // 保留30天
Compress: true, // 压缩旧日志
})
log.Println("This is a rotated log message")
}
适合需要将日志管理逻辑封装在应用内部的场景。
3. 结构化日志(便于分析与检索)
结构化日志(如JSON格式)比纯文本更易被工具解析,推荐使用logrus或zap:
logrus示例:
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.WithFields(logrus.Fields{
"user": "admin",
"action": "login",
"status": "success",
}).Info("User login event")
}
输出示例:{"level":"info","msg":"User login event","user":"admin","action":"login","status":"success"}。
zap示例:
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("User login event",
zap.String("user", "admin"),
zap.String("action", "login"),
zap.String("status", "success"),
)
}
输出示例:{"level":"info","ts":1634567890,"msg":"User login event","user":"admin","action":"login","status":"success"}。
4. 日志分级(精准控制输出)
通过日志级别过滤无关信息,减少日志量:
logrus.SetLevel(logrus.InfoLevel)设置级别(Debug < Info < Warn < Error < Fatal < Panic);zapcore.Level设置级别,如zap.NewProductionConfig().Level = zap.NewAtomicLevelAt(zap.InfoLevel);if level >= InfoLevel判断)。。5. 日志输出到系统日志(集中管理)
将Golang日志发送到CentOS系统日志(journald),便于统一收集与查看:
/etc/rsyslog.conf,添加local0.* /var/log/myapp.log(将local0设施的日志写入/var/log/myapp.log);log包设置前缀,如log.SetPrefix("local0. "),并输出到标准输出(log.SetOutput(os.Stdout));sudo systemctl restart rsyslog使配置生效。journalctl -t myapp查看应用日志。6. 使用Supervisor管理日志进程
通过Supervisor守护Golang应用进程,确保日志持续输出并自动重启异常进程:
sudo yum install supervisor -y;/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
sudo systemctl start supervisord,通过sudo supervisorctl status查看进程状态。7. 日志监控与分析(提升可观测性)
结合工具实现日志的实时监控与分析:
tail -f /var/log/myapp.log或multitail(支持多文件同时查看);