Bash脚本实现wget定时下载日志检测变更及重置处理
Bash日志轮询监控脚本优化方案
你原有的实现思路基本成立,但完全不需要额外配置cron任务处理午夜日志清空的场景,直接在脚本内增加简单判断即可覆盖该场景,同时可以简化新增日志的提取逻辑,省去处理diff冗余格式的工作量。
核心优化点
- 针对日志纯追加写入的特性,直接按行号截取新增内容,输出无多余格式标记,可直接用于告警格式化,比diff方案更高效
- 每次下载新日志后自动比对新旧日志行数:如果新日志行数小于本地留存的旧基准日志行数,直接判定为远端日志清空/轮转,即时更新本地基准文件跳过告警,无需额外配置定时清理任务
- 脚本内置循环和等待逻辑,后台常驻运行即可,无需依赖cron按5分钟间隔触发
完整实现代码
#!/bin/bash LOG_URL="https://url-to-logs.org" # 初始化基准日志文件,不存在则创建空文件 [ -f old_log ] || touch old_log while true; do # 静默下载最新日志 wget -q "$LOG_URL" -O new_log old_line_count=$(wc -l < old_log) new_line_count=$(wc -l < new_log) if [ "$new_line_count" -lt "$old_line_count" ]; then # 命中日志截断/清空场景,直接更新基准,不触发告警 cp new_log old_log rm -f new_log elif diff -q new_log old_log >/dev/null; then # 无新增日志条目 echo "no new log entries to send." rm -f new_log else echo "new log entries found, sending alert." # 直接截取纯新增行,无diff格式冗余 tail -n +$((old_line_count + 1)) new_log > new_entries # 在此处编写告警逻辑,直接读取new_entries内容做格式化发送即可 # 示例:mail -s "新增日志告警" 你的接收邮箱 < new_entries # 更新本地基准日志 cp new_log old_log rm -f new_log new_entries fi # 等待5分钟进入下一轮 sleep 300 done
注意事项
- 脚本中wget增加了
-q静默参数,不会输出下载进度等冗余信息,适合后台常驻运行 - 删除临时文件用
rm -f即可,无需使用rm -rf:处理普通文件不需要递归参数,避免变量异常时引发误删风险 - 脚本内识别日志截断的逻辑兼容性远好于固定午夜cron清理的方案,哪怕日志清空时间有偏差、或者出现非计划内的日志重置,都能正常处理,不会触发误报
- 可以搭配简单的进程守护或开机自启配置保证脚本持续运行,维护成本比多cron任务方案低很多
内容的提问来源于stack exchange,提问作者John Jolly
相关产品推荐
相关产品推荐

