如何让 syslogd 通过电子邮件将某些日志消息发送给我?

jas*_*son 12 linux logging syslog

我希望能够在 syslogd 记录某些内容时收到电子邮件通知,例如err优先级或更高。假设这是一个与 BSD 兼容的系统日志守护进程。

  • 这能实现吗?
  • 我应该使用命名管道到 shell 脚本吗?
  • 还有哪些其他可能的解决方案?

Den*_*son 6

这是一个使用命名管道的解决方案。它是为 Debian 设置的,但您应该能够为 BSD 修改它。

  • 根本不是黑客。这种事情往往就是这样完成的。 (2认同)

小智 6

通过 syslogd(8) 通知

在我的 OpenBSD 服务器上,我从使用工具local1 的Web 应用程序中记录和发送重要消息。这是我的/etc/syslog.conf来实现它:

local1.err    /var/log/example.com
local1.err    |while read log; do echo "$log" | /usr/bin/mail -s SYSLOG me@example.com; done
Run Code Online (Sandbox Code Playgroud)

请注意,while 循环无限地从 syslogd 读取每一行,然后通过 echo 将其通过管道发送到邮件。这个很重要。一旦 echo 输出它的行,它就会终止管道,发送邮件一个 EOF,以便它可以通过电子邮件发送日志消息。

换句话说,您不能像这样通过 syslogd 直接通过管道发送邮件:

local1.err    |/usr/bin/mail -s SYSLOG me@example.com
Run Code Online (Sandbox Code Playgroud)

因为 syslogd 将继续写入管道,直到它本身终止或发送 HUP 信号,此时邮件将在一封大电子邮件中发送整个日志消息集。

通过newsyslog(8) 通知

在 cron 中调度 newsyslog 是另一种以较慢的速度或批量获取消息的方法。

例如,如果您想要日志消息的每日电子邮件摘要,请设置M标志并在/etc/newsyslog.conf 中指定监视器电子邮件地址:

# logfile_name        owner:group  mode  count  size  when  flags  monitor
/var/log/example.com  root:wheel   640   7      *     24    M      me@example.com
Run Code Online (Sandbox Code Playgroud)

然后在 crontab 中调度 newsyslog:

# minute hour  mday  month  wday  command
0        *     *     *      *     /usr/bin/newsyslog
1-59     *     *     *      *     /usr/bin/newsyslog -m
Run Code Online (Sandbox Code Playgroud)

newsyslog(8)-m选项指出:

监控模式;仅处理标志中标有“M”的条目。对于每个被监视的日志文件,自上次使用 -m 标志运行 newsyslog 以来的任何日志输出都将通过邮件发送给监视器通知部分中列出的用户。