日志分析与统计脚本

日志分析与统计脚本是Linux运维中实现自动化监控与问题诊断的核心工具,其构建需遵循"日志格式适配-核心指标提取-结果可视化"的逻辑流程,确保从原始日志数据中高效提取有价值的运维指标。

日志格式适配:字段索引映射机制

日志格式适配是日志分析的前置条件,其核心在于准确识别日志字段与awk索引的映射关系。以Nginx服务器为例,默认采用的combined日志格式定义如下:

plaintext
复制代码
$remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

该格式中各字段对应的awk索引需通过位置映射确定:$1对应客户端IP地址,$4-$5组合为访问时间戳(需通过substr函数处理),$7为请求URL路径,$9为HTTP状态码,$10为响应大小。当日志格式自定义时(如添加$request_time响应时间字段),需通过awk -F指定分隔符(通常为空格或双引号)并重新校准字段索引,例如包含虚拟主机的日志格式中,$1可能代表虚拟主机名,客户端IP需调整为$2

关键操作提示:通过head -n 1 access.log | awk '{print $0}'查看日志首行,使用awk -F '[ "]+' '{for(i=1;i<=NF;i++)print i ":" $i}'命令可快速列出所有字段索引及对应值,确保后续指标提取的准确性。

核心指标提取:命令组合与数据加工

基于适配后的字段索引,可通过Linux命令链实现多维度指标提取,典型场景包括:

IP访问统计:通过提取客户端IP并进行去重计数,识别高频访问来源。基础命令组合为:

bash
复制代码
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

其中awk '{print $1}'提取IP字段,sort进行排序,uniq -c实现计数去重,sort -nr按访问量逆序排列,head -10取Top 10结果。进阶场景可结合grep过滤特定时间段,如grep "29/Aug/2025:00:00" access.log | awk '{print $1}' | ...

状态码分布:分析HTTP状态码占比以评估服务健康度,命令组合为:

bash
复制代码
awk '{print $9}' access.log | sort | uniq -c | awk '{printf "状态码 %s: %d 次 (%.2f%%)\n", $2, $1, $1/total*100}' total=$(wc -l < access.log)

该命令通过嵌套awk实现百分比计算,total=$(wc -l < access.log)获取总请求数,printf格式化输出状态码、绝对次数及占比。常见状态码中,200表示正常响应,404提示资源不存在,500系列则指示服务器内部错误。

URL访问热度:统计请求路径的访问频次,需注意URL字段可能包含空格(如GET /path?a=1&b=2 HTTP/1.1),需通过awk -F '"' '{print $2}'先提取完整请求行,再截取URL部分:

bash
复制代码
awk -F '"' '{print $2}' access.log | cut -d' ' -f2 | sort | uniq -c | sort -nr | head -10

其中-F '"'以双引号为分隔符,$2提取请求行(如GET /index.html HTTP/1.1),cut -d' ' -f2截取URL路径部分。

结果可视化与自动化部署

日志分析结果需通过输出文件存储与定时报告机制实现价值落地。结果持久化可通过重定向操作符实现,例如将IP统计与状态码分布整合输出至报告文件:

bash
复制代码
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
REPORT_FILE="/tmp/nginx_report_$(date +%Y%m%d).txt"

echo "=== Nginx访问日志分析报告 $(date +%Y-%m-%d) ===" > $REPORT_FILE
echo -e "\n[Top 10 IP访问统计]" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo -e "\n[HTTP状态码分布]" >> $REPORT_FILE
awk '{print $9}' $LOG_FILE | sort | uniq -c | awk -v total=$(wc -l < $LOG_FILE) '{printf "  %s: %d (%.2f%%)\n", $2, $1, $1/total*100}' >> $REPORT_FILE

报告分发可通过mail命令实现邮件推送,在脚本末尾添加:

bash
复制代码
mail -s "Nginx每日访问报告 $(date +%Y-%m-%d)" admin@example.com < $REPORT_FILE

需确保系统已配置sendmailpostfix邮件服务,可通过echo "test" | mail -s "test" user@example.com验证邮件功能。

自动化执行通过crontab实现定时调度,编辑定时任务:

bash
复制代码
crontab -e
0 3 * * * /bin/bash /usr/local/bin/nginx_log_analyzer.sh

建议同时配置日志轮转(如logrotate),避免单个日志文件过大导致分析效率下降。

通过上述流程,日志分析脚本可实现从格式适配到自动化报告的全链路闭环,为运维决策提供数据支持,其核心价值在于将原始日志转化为结构化指标,通过标准化流程降低人工分析成本。在实际应用中,可根据业务需求扩展指标维度,如结合geoip实现IP地域分布分析,或通过awk计算平均响应时间等性能指标。