日志分析与报告生成是系统管理和运维中的重要任务,能够帮助识别问题、优化性能并生成统计报告。通过编写 Shell 脚本,可以自动化完成日志分析、提取关键信息并生成报告。以下是一个日志分析与报告生成的实战项目示例。
1. 项目需求
假设我们有一个 Web 服务器的访问日志文件(access.log),需要实现以下任务: 1. 分析日志文件,统计访问量、状态码分布、热门页面等。 2. 生成报告文件,包含统计结果。 3. 支持定期运行并发送报告。
2. 日志文件格式
假设日志文件格式如下(Nginx 默认格式):
192.168.1.1 - - [10/Oct/2023:14:30:01 +0000] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [10/Oct/2023:14:30:02 +0000] "GET /about.html HTTP/1.1" 404 512
3. 脚本设计
3.1 脚本功能
- 统计访问量:统计总访问量。
- 状态码分布:统计不同 HTTP 状态码的出现次数。
- 热门页面:统计访问量最高的页面。
- 生成报告:将统计结果写入报告文件。
3.2 脚本结构
#!/bin/bash
# 日志分析与报告生成脚本
# 配置
LOG_FILE="/var/log/nginx/access.log"
REPORT_FILE="/var/log/nginx/access_report.txt"
TOP_PAGES=5
# 函数定义
function analyze_log() {
echo "Analyzing log file: $LOG_FILE..."
# 统计总访问量
total_visits=$(wc -l < log_file echo total visits: total_visits> "$REPORT_FILE"
# 统计状态码分布
echo -e "\nStatus code distribution:" >> "$REPORT_FILE"
awk '{print $9}' "$LOG_FILE" | sort | uniq -c | sort -nr >> "$REPORT_FILE"
# 统计热门页面
echo -e "\nTop $TOP_PAGES most visited pages:" >> "$REPORT_FILE"
awk '{print $7}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n "$TOP_PAGES" >> "$REPORT_FILE"
}
# 主逻辑
analyze_log
echo "Report generated: $REPORT_FILE"
4. 脚本说明
4.1 配置部分
- LOG_FILE:日志文件路径。
- REPORT_FILE:报告文件路径。
- TOP_PAGES:热门页面的数量。
4.2 函数定义
- analyze_log:分析日志文件并生成报告。
4.3 主逻辑
调用 analyze_log 函数完成日志分析并生成报告。
5. 使用说明
5.1 准备工作
- 确保日志文件存在并具有可读权限。
- 将脚本保存为 log_analyzer.sh,并赋予执行权限:
chmod +x log_analyzer.sh
5.2 运行脚本
运行脚本:
./log_analyzer.sh
5.3 查看报告
报告文件将生成在
/var/log/nginx/access_report.txt,内容如下:
Total visits: 1000
Status code distribution:
800 200
150 404
50 500
Top 5 most visited pages:
300 /index.html
200 /about.html
100 /contact.html
50 /products.html
30 /blog.html
6. 扩展功能
6.1 定期运行
使用 cron 定期运行脚本并发送报告: 1. 编辑 cron 任务:
crontab -e
- 添加以下内容(每天凌晨 2 点运行):
0 2 * * * /path/to/log_analyzer.sh
6.2 发送报告
使用 mail 命令将报告发送到邮箱:
mail -s "Access Log Report" user@example.com < "$REPORT_FILE"
6.3 错误处理
添加错误处理逻辑,确保脚本在出错时退出:
set -e # 任何命令失败时退出脚本
6.4 日志轮转
结合 logrotate 管理日志文件,避免日志文件过大: 1. 创建 logrotate 配置文件:
sudo nano /etc/logrotate.d/nginx
- 添加以下内容:
/var/log/nginx/access.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 www-data adm
postrotate
/usr/sbin/nginx -s reload
endscript
}
7. 总结
- 日志分析与报告生成是系统管理和运维中的重要任务。
- 通过 Shell 脚本可以自动化完成日志分析、提取关键信息并生成报告。
- 结合 cron 和 mail 可以实现定期运行和报告发送。
- 脚本应具备良好的错误处理和日志轮转功能,确保系统的稳定性和可靠性。