我发现当我的一台 linux 服务器在低级别出现问题时,我可以在kernel ring buffer中看到有关它的消息。这些可以使用dmesg命令从命令行查看。
我想知道是否有一种简单的方法可以让我的服务器在将某些内容添加到内核环形缓冲区时向我发送电子邮件?
现在我有一个每小时运行一次的脚本,复制 dmesg 的输出并针对前一小时的文件运行差异。不幸的是,这并不能很好地工作,因为当行被附加到 dmesg 输出的末尾时,其他行从头开始被截断。此外,如果我有很多相同的消息,它就会完全停止通知我。
有没有更好的方法来做到这一点?
有没有其他人认为在这些消息发生时看到这些消息很重要?
添加
- dmesg命令报告的信息是否与其中一个日志文件中的信息相同?(如果是这样,那么解决方案比我想象的要容易)
有许多工具旨在收集这些信息并定期报告。
我发现 Lire 工具(来自LogReport系统)是一个很好的报告工具,但您可能也对Logcheck和Logwatch 感兴趣。所有软件都是免费软件,可以直接从大多数主要的 GNU/Linux 软件包存储库安装。
这是一个快速而肮脏的解决方案。你可能会收到很多邮件。我建议添加一些
grep
和/或grep -v
命令。当然,您也可以将此技术用于其他日志文件。将此命令添加到您/etc/rc.d/rc.local
或您的系统的等效项中(在从命令行对其进行测试之后)。编辑:更改为大写 F 以使 tail 按名称跟随文件以便能够处理日志轮换。
以下脚本会将任何新条目发送到 /var/log/kern.log 给 root 用户。
将其放入/etc/cron.hourly将每小时发送一封电子邮件,但前提是有新的内核消息。
有一个名为 cronolog(1) 的不错的实用程序,它读取流并根据日期模板将其拆分。我的 Apache 配置文件之一的示例:
这会将所有 Apache 日志拆分为 example.org/yyyy/yy-mm-ddZ.access_log 格式,这通常会使生活更轻松。
现在,如何在您的情况下使用它:启动一个记录 /var/log/messages 中发生的所有事情的进程:
这会将输出拆分为文件名格式的文件
每过一小时两分钟,从 cron 运行一个脚本,检查最后一小时是否生成了日志文件。像这样的东西:
如果未找到文件,则不发送邮件。使用此系统,您还将在 $LOGDIR 目录中备份您的日志。
如果您没有 kern.log 并且想要创建并保留一个,请编辑 /etc/syslog.conf 并添加以下内容
kern.* -/var/log/kern.log
如果您需要有关配置 syslogd 的更多帮助,请尝试“man 5 syslog.conf”。
此外,swatch ( http://sourceforge.net/projects/swatch/ ) 是另一种可以轻松配置为查看日志文件的工具。
StackKrish 在正确的轨道上,但仍然不发送电子邮件。为此,您可以使用 syslog-ng 之类的东西,它允许将命令记录到具有 program() 目标的程序。如果您不想这样做,您可以让常规 syslogd 记录到命名管道/fifo,然后可以将其连接到发送电子邮件的简单脚本。