分析应用程序日志是运维和开发中的常见任务。Linux提供了丰富的命令行工具来高效完成这项工作。以下是系统化的日志分析方法:
- tail -f /path/to/log
实时追踪日志尾部变化(生产环境常用)
- less +F /path/to/log
交互式实时查看(支持回翻)
- grep "ERROR" /var/log/app.log
快速过滤关键错误
# 时间范围分析
sed -n '/2023-10-01 14:00/,/2023-10-01 15:00/p' app.log | grep -C 3 "Exception"
# 多条件统计
cat app.log | awk '/WARNING/{warn++} /ERROR/{err++} END{print "Warnings:",warn,"Errors:",err}'
# 高频错误TOP10
grep -oE '[A-Z]+_[A-Z]+' error.log | sort | uniq -c | sort -nr | head
# 使用jq解析JSON日志
jq '. | select(.level == "ERROR") | {time: .timestamp, msg: .message}' app.json
# 统计不同服务的错误数
jq -r '.service + " " + .level' logs/*.json | awk '$2=="ERROR"{count[$1]++} END{for(s in count) print s,count[s]}'
# 响应时间百分位统计
awk '/response_time/{gsub("ms",""); sum+=$NF; count++; vals[count]=$NF}
END{asort(vals); print "95th:", vals[int(count*0.95)], "Avg:", sum/count}' access.log
# 慢请求分析
awk '$NF > 1000 {print $0}' nginx.log | cut -d' ' -f1,7 | sort | uniq -c
# 生成错误频率时序图(需安装gnuplot)
grep "ERROR" app.log | awk '{print $1}' | uniq -c |
gnuplot -p -e 'set xdata time; set timefmt "%Y-%m-%d"; plot "-" using 2:1 with lines title "Errors"'
# 对比轮转前后的错误变化
diff <(zcat app.log.1.gz | grep "ERROR") <(grep "ERROR" app.log)
专业建议:
1. 对于大型日志文件,先用head/tail
采样确认格式
2. 复杂分析建议分阶段处理,中间结果存临时文件
3. 高频分析任务应该建立日志收集系统(ELK/Splunk)
4. 关键应用日志应该配置实时告警规则
这些命令可以组合使用,例如实时监控错误并统计:
tail -f app.log | grep --line-buffered "ERROR" |
awk '{count++; print "Total errors:", count; system("")}'
掌握这些工具组合可以应对90%以上的日志分析场景,建议根据具体日志格式调整字段提取方式。