在CentOS环境中,分析Golang日志可通过基础命令行工具、日志轮转管理、专业分析工具及自定义脚本等方式实现,覆盖从简单查看至复杂可视化的需求。
Golang应用的日志通常输出到文件(如/var/log/myapp.log)或标准输出(控制台)。需通过以下方式确认:
config.yaml)中的log.path或log.file参数;log.SetOutput(标准库)或logger.Out(第三方库如logrus)的设置;app.log或stderr。CentOS自带的命令行工具可满足日常日志查看需求:
cat命令输出文件全部内容(适合小文件):cat /path/to/app.log
tail -f实时跟踪日志文件的最后几行(适合监控实时日志):tail -f /path/to/app.log
less分页浏览(支持上下翻页、搜索):less /path/to/app.log
grep过滤关键词(如查找ERROR日志):grep "ERROR" /path/to/app.log
# 忽略大小写搜索
grep -i "error" /path/to/app.log
# 显示匹配行及前后5行上下文
grep -C 5 "ERROR" /path/to/app.log
awk或sed提取字段(如统计错误数量):# 统计ERROR日志数量
awk '/ERROR/ {count++} END {print "Error count:", count}' /path/to/app.log
# 提取日志中的时间戳和消息(假设格式为"[2025-10-17] ERROR: xxx")
sed -n 's/^\[\([^]]*\)\] ERROR: \(.*\)/\1 \2/p' /path/to/app.log
当日志文件过大时,需用logrotate工具自动切割、压缩和归档日志,防止占用过多磁盘空间。
/etc/logrotate.d/目录下新建应用专属配置(如myapp):sudo vi /etc/logrotate.d/myapp
/path/to/your/logs/*.log {
daily # 每天轮转
missingok # 文件不存在时不报错
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(.gz格式)
notifempty # 日志为空时不轮转
create 0640 root root # 新日志文件权限和所有者
sharedscripts # 所有日志处理完再执行后续命令
postrotate # 轮转后执行的命令(如重启应用以重新打开日志文件)
systemctl restart yourapp.service
endscript
}
logrotate -vf /etc/logrotate.d/myapp验证配置是否正确。对于大规模日志或需要可视化、告警的场景,建议使用专业工具:
若需定制化分析(如统计每小时请求量、提取特定字段),可编写Shell、Python等脚本:
#!/bin/bash
LOG_FILE="/path/to/app.log"
OUTPUT_FILE="/path/to/error_stats.txt"
echo "ERROR统计 - $(date '+%Y-%m-%d')" > $OUTPUT_FILE
awk '/ERROR/ {print $1}' $LOG_FILE | sort | uniq -c >> $OUTPUT_FILE
status字段并统计分布):import json
from collections import defaultdict
log_file = "/path/to/app.json.log"
status_count = defaultdict(int)
with open(log_file, "r") as f:
for line in f:
try:
log_data = json.loads(line)
status = log_data.get("status")
if status:
status_count[status] += 1
except json.JSONDecodeError:
continue
print("状态码分布:")
for status, count in status_count.items():
print(f"{status}: {count}次")
结合监控工具(如Prometheus + Grafana),可实现日志的实时监控与异常告警:
prometheus/client_golang库暴露指标接口,供Prometheus抓取。通过以上步骤,可在CentOS上高效分析Golang日志,从基础查看至复杂分析均能覆盖,满足不同场景的需求。