【问题标题】:using wget to download log file every 5 mins & detect changes使用 wget 每 5 分钟下载一次日志文件并检测更改
【发布时间】:2022-07-12 17:18:42
【问题描述】:

我正在编写一个 bash 脚本来完成以下任务。

  1. 脚本每五分钟运行一次 wget,以从静态 url 下载小日志。
  2. 脚本使用 diff 查看日志文件中是否有新条目(新条目在日志文件末尾)。
  3. 如果找到新的日志条目 - 将新条目提取到新文件中,正确格式化,向我发送警报,返回 #1。
  4. 如果没有找到新的日志条目,请返回 #1。
wget "https://url-to-logs.org" -O new_log
if diff -q new_log old_log; then
echo "no new log entries to send."
else
echo "new log entries found, sending alert."
diff -u new_log old_log > new_entries

#some logic i have to take the output of "new_entries", properly format the text and send the alert.

rm -rf old_log new_entries
cp new_log old_log
rm -rf new_log
fi

还有一件事 - 每晚午夜,托管日志的服务器都会删除所有条目并显示一个空白文件,直到为新的一天创建新的日志条目。

我想我总是可以在午夜运行一个 cron 作业来运行“rm -rf”并“触摸”old_log 文件,但很好奇是否存在更简单的方法。

提前感谢您的任何/所有意见和帮助。

【问题讨论】:

  • 一个简单的技巧是检查新文件中的行数,并与最后一个或更难的文件进行比较 - 解析日期/时间标题是否与日志行一起存在。
  • 您的日志是否包含时间戳?
  • 是的,它们包括时间戳。

标签: linux bash diff wget script


【解决方案1】:

如果您的日志没有轮换 - 即旧日志保证是新日志的前缀,您可以使用 tail 获取新后缀 - 如下所示:

tail -n+$(( $(wc -l old_log) + 1 )) new_log > new_entries

如果new_log中没有新行,则new_entries文件为空,可以使用stat或其他方式检查。

如果您的日志正在轮换,您应该首先使用grep 检查旧日志的最后一行是否存在于新日志中,如果不存在 - 假设整个新日志是新的:


if ! egrep -q "^$(tail -n1 old_log)\$" new_log; then cat new_log > new_entries; fi

【讨论】:

    【解决方案2】:

    如果您的日志文件中的所有行都是唯一的,那么您可以使用 grep:

    wget "https://url-to-logs.org" -O new_log || exit 1
    
    if new_entries=$(grep -vxFf old_log new_log)
    then
        # format and send alert
        printf '%s\n' "$new_entries"
    fi
    
    mv -f new_log old_log
    

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多