监视dmesg输出

我发现当我的一台linux服务器出现低级错误时,我可以在内核环形缓冲区中看到有关它的消息。 这些可以从命令行使用dmesg命令查看。

我想知道是否有一个简单的方法让我的服务器发送电子邮件给我什么东西被添加到内核​​环缓冲区?

现在我有一个每小时运行一次的脚本,复制dmesg的输出,并对前一小时的文件运行diff 。 不幸的是,这并不能很好地工作,因为在dmesg输出的末尾添加了行,所以其他行从头开始被截断。 而且,如果我有很多相同的信息,它只是完全不通知我。

添加

  • dmesg命令报告的信息与其中一个日志文件相同吗? (如果是这样,那么解决scheme比我想象的更容易)

有许多工具可以收集这些信息并定期报告。

我发现Lire工具(来自LogReport系统)是一个很好的报告工具,但您也可能对Logcheck和Logwatch感兴趣 。 所有这些都是免费软件 ,可以直接从大多数主要的GNU / Linux软件包库中安装。

这是一个快速和肮脏的解决scheme。 你可能会收到很多邮件。 我build议添加一些grep和/或grep -v命令。 当然,您也可以将这种技术用于其他日志文件。 将这个命令添加到/etc/rc.d/rc.local或者你的系统中(在从命令行testing之后)。

 sudo tail -F /var/log/messages | while read line ; do echo "$line"|mail -s Subject recipient; done & 

编辑 :更改为大写字母F,使尾部按名称跟随文件,以便能够处理日志旋转。

以下脚本将向root用户发送任何新条目到/var/log/kern.log。
把它放在/etc/cron.hourly中,每小时都会发送一封邮件,但前提是有新的内核消息。

 #!/bin/bash MAILTO=root LOG=/var/log/kern.log OFFSET_FILE=$0.offset if [ ! -f $OFFSET_FILE ]; then echo 0 > $OFFSET_FILE; fi OFFSET=`cat $OFFSET_FILE` FILESIZE=`cat $LOG|wc -c` # Check if log has been rotated if [ "$OFFSET" -gt "$FILESIZE" ]; then OFFSET=0 echo 0 > $OFFSET_FILE fi if [ "$FILESIZE" -gt "$OFFSET" ]; then tail -c+$OFFSET $LOG|sed "s/^/ /"|mail $MAILTO -s "new kernel alerts" echo $FILESIZE > $OFFSET_FILE fi 

有一个很好的实用工具叫做cronolog(1),它读取一个stream并根据date模板分割它。 来自我的一个Apacheconfiguration文件的例子:

 CustomLog "|/usr/bin/cronolog -z0 /var/log/apache2/example.org/%Y/%Y-%m-%dZ.access_log" combined 

这将把所有的Apache日志分成一个example.org/yyyy/yy-mm-ddZ.access_log格式,这样可以使生活通常更简单。

现在,在您的情况下如何使用它:启动一个logging/ var / log / messages中发生的所有事件的进程:

 tail -F /var/log/messages | cronolog -z0 /var/log/mylog/dmesg/%Y-%m-%d_%H.log & 

这会将输出分割成文件名格式的文件

 /var/log/mylog/dmesg/yyyy-mm-dd_hh.log 

每隔两分钟一小时,从cron运行一个脚本,检查最近一小时是否生成日志文件。 像这样的东西:

 #!/bin/bash # This script is executed every XX:02 from cron LOGDIR=/var/log/mylog/dmesg # Get date string five minutes ago LOGDATE=$(date -u +"%Y-%m-%d_%H" -d "5 min ago") if [ -e $LOGDIR/$LOGDATE.log ]; then mail -s "dmesg log for $LOGDATE" [email protected] <$LOGDIR/$LOGDATE.log fi 

如果找不到文件,则不发送邮件。 有了这个系统,你也可以在$ LOGDIR目录下备份你的日志。

如果你没有kern.log并想创build并保留一个,编辑/etc/syslog.conf并添加以下内容

kern.* -/var/log/kern.log

如果你需要更多的configurationsyslogd的帮助,试试'man 5 syslog.conf'。

另外斯沃琪( http://sourceforge.net/projects/swatch/ )是另一个可以很容易地configuration来观看日志文件的工具。

StackKrish是正确的轨道,但仍不会发送电子邮件。 要做到这一点,你可以使用类似syslog-ng的东西,它允许通过程序()目的地logging到程序的命令。 如果你不想这样做,你可以定期的syslogdlogin到一个命名的pipe道/ FIFO,然后可以连接到一个简单的脚本,将发送电子邮件。