linux巡检脚本用shell提取日志error:先限定日志源和时间范围(journalctl或grep+date),再用-w或正则精准匹配避免误报,排除debug/warn等干扰,结构化输出统计与样例,结合cron定时执行并支持邮件告警或标记文件。

Linux 下编写巡检脚本自动提取日志中的 ERROR 关键字,核心是结合日志路径、时间范围、关键字匹配和结果汇总。不依赖复杂工具,用 shell 就能高效完成。
明确日志源和时间窗口
先确定要检查的日志文件(如 /var/log/messages、/var/log/syslog 或应用自定义日志),再限定时间范围避免全量扫描——常用方法是用 journalctl(systemd 系统)或按文件修改时间 + grep 过滤。
- 查最近 24 小时的 ERROR(journalctl):
journalctl --since "1 day ago" | grep -i "error" - 查指定日志文件中今天新增的 ERROR:
grep -i "error" /var/log/app.log | grep "$(date +%Y-%m-%d)" - 若日志按天轮转(如
app.log.2024-06-15),可用zgrep查压缩归档:zgrep -i "error" /var/log/app.log.$(date -d "yesterday" +%Y-%m-%d).gz
精准匹配 ERROR,避免误报
直接 grep ERROR 容易匹配到 “no error”、“error_code” 等干扰项。推荐用单词边界 -w 或正则锚定:
-
grep -iw "\berror\b"—— 匹配独立单词 “error”,忽略大小写 -
grep -E "(ERROR|Error|error)[[:space:]:]"—— 匹配后紧跟空格或冒号,更贴近真实日志格式 - 排除调试信息(如 “INFO … error ignored”):
grep -i "error" | grep -v -i "ignored\|debug\|warn"
结构化输出并记录巡检结果
脚本需生成可读报告,包含时间戳、错误条数、关键行摘要,并保存到指定目录便于追踪:
- 开头记录执行时间:
echo "=== $(date) ===" >> /var/log/monitor/error_report.log - 统计+抽样:
grep -c -iw "\berror\b" /var/log/messages >> report.log; grep -iw "\berror\b" /var/log/messages | head -n 5 >> report.log - 按严重程度分级(可选):
grep -E "(FATAL|CRITICAL|ERROR)"单独高亮,grep -i "warning"另存为次要问题
加入定时调度与简单告警
用 crontab 每小时运行一次,发现错误时发邮件或写入告警文件:
- cron 示例(每小时 10 分执行):
10 * * * * /opt/scripts/check_error.sh >/dev/null 2>&1 - 检测到错误后触发动作:
if [ $(grep -c -iw "\berror\b" /var/log/messages) -gt 0 ]; then echo "ERROR found at $(date)" | mail -s "Log Alert" admin@example.com; fi - 轻量替代方案:写入标记文件
/tmp/error_alert.flag,由外部监控系统轮询
不复杂但容易忽略细节——关键是限定范围、过滤噪声、留痕可查。写完记得加执行权限:chmod +x check_error.sh,再手动跑一遍验证输出是否符合预期。











