新建日志条目 -> 邮件通知

新建日志条目 -> 邮件通知

我正在寻找一个脚本(bash / perl / python),该脚本每 5 秒由 cron 调用一次,检查是否有新行添加到我的特定日志文件。如果有任何新行,该脚本应向 root 发送包含日志事件的通知邮件。

有什么方法可以实现这个目的?

答案1

您可以尝试 Tenshi。它是用 Perl 编写的,非常容易设置,并且完全符合您的要求。来自 Ubuntu 软件包描述:

“Tenshi 是一个日志监控程序,旨在监视一个或多个日志文件中与用户定义的正则表达式匹配的行并报告匹配情况。正则表达式被分配给具有警报间隔和邮件收件人列表的队列。”

Ubuntu 软件包(关联)、Debian 软件包 (关联)。

答案2

这可以通过执行以下任务的 bash 脚本来完成:

  1. 让后台进程监视每个日志文件tail -f,并将输出写入缓冲区位置。
  2. 定期收获、采取行动和截断缓冲位置。

我会使用单个脚本,可能像 init 脚本一样启动,而不是 cron 作业。例如:

#!/bin/bash

RECIPIENT=root
SUBJECT="Log monitor"
PERIOD=5    # Harvest log buffer every PERIOD seconds

# Prepare the log buffer and ensure it is empty
LOGBUFFER=/tmp/logbuffer.$$
cp /dev/null $LOGBUFFER

# Monitor the log files in the background.
# More than one log file can be specified on the command line.
for file in "$@"; do
    tail -f -n0 "$file" | while read line;do echo "$file: $line";done >> $LOGBUFFER &
done

# Harvest the log buffer
while :;do
    if [ -s $LOGBUFFER ]; then
        mail -t "$RECIPIENT" -s "$SUBJECT" < $LOGBUFFER
        cp /dev/null $LOGBUFFER
    fi
    sleep $PERIOD
done

该脚本并不完美(例如,它/tmp/logbuffer.123在退出时会留下一个文件)但它应该可以帮助您入门。

答案3

如果您考虑改用 syslog-ng,您可以将其配置为自动启动 shell 脚本,该脚本可以根据 syslog 消息模式触发电子邮件。我已将此用于安全日志记录。

答案4

每 5 秒通过 cron 调用一次

Cron 没有小于分钟的粒度。如果您想要这种粒度,则需要 incrond。只需执行类似以下操作:

/var/log IN_CLOSE_WRITE /usr/local/sbin/notify.sh $@/$#

以及一个向您发送邮件的脚本:

tail $1 | mail -s "New lines in: $1" root

您可能需要尝试使用正确的事件类型。但是这样就没有必要以定时方式启动脚本。如果您正确设置了 incrontab,则可以确保每次启动脚本时都会发生一些变化。

相关内容