核心是定时抓取、过滤关键错误、去重归类并生成可读报告:匹配error/ERROR/failed/Failed/panic/segfault/oom_killer,排除systemd健康日志,结合journalctl时间范围或文件截取,用awk提取服务名+错误类型聚类统计,输出含次数、服务、描述、时间的表格至每日轮转报告,脚本启用set -e -u及超时保护。
用脚本自动汇总系统错误日志,核心是定时抓取、过滤关键错误、去重归类并生成可读报告。不需要手动翻查,也能快速定位高频问题。
筛选真正需要关注的错误行
系统日志(如 /var/log/syslog 或 /var/log/messages)里大量是 info 或 warning,直接全量分析效率低。脚本应优先匹配明确的错误标识:
- 匹配关键词: “error”、“ERROR”、“failed”、“Failed”、“panic”、“segfault”、“oom_killer”(注意大小写和上下文,避免误匹配路径或用户名)
- 排除干扰项:用 grep -v 过滤已知无关条目,例如 "systemd: Started Session..." 或重复的健康检查日志
- 结合时间范围:用 journalctl --since "2 hours ago" 或按日志文件时间戳截取,避免扫描过旧内容
按服务或模块聚合同类错误
原始错误行杂乱,需提取共性字段再分组。常见做法:
- 用 awk 提取第4–6列(通常是服务名、进程ID、错误类型),例如:awk '{print $4, $5, $6}'
- 对关键字段(如服务名+错误码)做哈希或拼接,作为分组键,统计出现次数
- 保留1–2条典型原始日志行作为示例,方便回溯上下文
生成轻量可读的汇总报告
输出不必复杂,重点清晰即可:
- 用 printf 或简单模板输出表格结构,包含:错误次数、服务/组件、简要描述、首次/最近出现时间
- 将结果写入 /var/log/error-summary-$(date +%Y%m%d).log,每日轮转不覆盖
- 若需通知,可用 mail -s "Daily Error Summary" admin@example.com < report.txt,但建议先加开关控制是否发送
加入基础稳定性保障
避免脚本自身出问题影响系统:
- 开头加 set -e 和 set -u,遇到命令失败或未定义变量立即退出
- 限制日志读取大小,例如用 head -n 100000 /var/log/syslog | ... 防止 OOM
- 在 crontab 中设置超时:timeout 300 /path/to/summarize-errors.sh

















