一、前期准备:配置结构化日志记录
在CentOS上分析Golang日志前,需先确保应用程序输出结构化日志(如JSON格式),便于后续工具解析。推荐使用以下第三方日志库替代标准库log:
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func main() {
logFile, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
logrus.SetOutput(logFile) // 输出到文件
logrus.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05"}) // JSON格式+时间戳
logrus.WithFields(logrus.Fields{"module": "user", "action": "login", "status": "success"}).Info("User logged in")
}
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction() // 生产环境配置(JSON格式)
defer logger.Sync()
logger.Info("User logged in",
zap.String("module", "user"),
zap.String("action", "login"),
zap.Bool("status", true),
)
}
配置完成后,Golang应用会将结构化日志输出到指定文件(如app.log)。
二、基础日志分析:使用Linux命令行工具
对于简单的日志查找、统计需求,可直接使用CentOS自带的命令行工具,无需额外安装软件:
grep筛选包含关键词(如"ERROR")的行,-i忽略大小写,-A 3显示匹配行后的3行上下文:grep -i "error" /path/to/app.log
grep -A 3 "timeout" /path/to/app.log
wc -l统计总行数,grep结合wc -l统计特定日志数量(如ERROR数量):wc -l /path/to/app.log # 总行数
grep -c "error" /path/to/app.log # ERROR数量
awk提取日志中的特定字段(如时间戳、模块名),假设日志格式为{"timestamp":"2025-01-01 12:00:00","module":"user","action":"login"}:awk -F'"' '{print $4, $8}' /path/to/app.log # 提取时间戳和action
sort排序日志,uniq -c统计频率,sort -rn按频率降序排列(如统计最常见的错误):grep "error" /path/to/app.log | sort | uniq -c | sort -rn
tail -f实时监控日志文件的新增内容,-n 100显示最后100行:tail -f /path/to/app.log
tail -n 100 -f /path/to/app.log
这些工具适合快速排查简单问题,但对复杂分析(如趋势可视化)支持有限。
三、进阶日志分析:使用专业日志分析工具
对于大规模、复杂的日志分析(如多应用日志聚合、可视化),推荐使用以下工具:
# 安装(CentOS 7+)
yum install epel-release -y && yum install goaccess -y
# 分析日志(生成HTML报告)
goaccess /path/to/app.log --log-format=JSON -o /var/www/html/report.html
访问http://your-server-ip/report.html即可查看可视化报告(包含请求数、响应时间、状态码分布等)。logstash.conf解析Golang结构化日志(JSON格式);四、日志轮转与管理:防止日志文件过大
为避免日志文件占用过多磁盘空间,需配置日志轮转(定期切割、压缩旧日志)。使用CentOS自带的logrotate工具:
/etc/logrotate.d/golang-app配置文件,内容如下:/path/to/app.log {
daily # 每天轮转
missingok # 日志文件不存在时不报错
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(如app.log.1.gz)
notifempty # 日志为空时不轮转
create 640 root root # 创建新日志文件的权限和所有者
}
logrotate -vf /etc/logrotate.d/golang-app(-v显示详细信息,-f强制轮转)。五、监控与告警:及时发现问题
结合监控工具,可实现日志异常的实时告警:
promtail(Grafana的日志收集工具)采集Golang日志,配置Prometheus监控日志中的错误关键词(如"ERROR"),并在Grafana中创建Dashboard展示错误趋势,设置告警规则(如1小时内ERROR数量超过10条时发送邮件/Slack通知)。#!/bin/bash
ERROR_COUNT=$(grep -c "error" /path/to/app.log)
if [ $ERROR_COUNT -gt 10 ]; then
echo "ERROR: Found $ERROR_COUNT errors in app.log" | mail -s "Golang App Error Alert" admin@example.com
fi
将脚本添加到crontab中,每5分钟执行一次:*/5 * * * * /path/to/alert_script.sh。