监视 Apache 错误日志中的特定字符串

监视 Apache 错误日志中的特定字符串

推荐的解决方案是什么:梳理 apache 前一天 /var/log/httpd/error_log 以查找包含特定字符串的行,并在检测到此类字符串时发送电子邮件?

它可以通过 cron 每小时运行一次,在我的情况下字符串将是“sigkill”或“reached maxclients”。

Nagios、Cacti 等都有点多余。我需要一些简单的东西。

谢谢

答案1

但是如果你真的更喜欢 perl,它比 bash 轻一点,但是...

#!/usr/bin/perl -w

use strict;

my $cachefile="/var/cache/lastpos-apache2-scan4maxclntOrSigKill";
my $logfile="/var/log/apache2/error.log";
my $searchstr="sigkill|reached maxclients";

my $lastpos=0;
if (-f $cachefile) {
    open FH,"<".$cachefile;
    $lastpos=<FH>;
    close FH;
};

my $newpos=(stat $logfile)[7];

open FH,"<".$logfile;
seek FH,$lastpos,0;
while (<FH>) {
    print if /$searchstr/i;
};
close FH;

open FH,">".$cachefile;
print FH $newpos;
close FH;

答案2

对于通过 cron 定期运行,您可以使用缓存来存储日志文件中的最后位置,然后在最新行上进行 grep:

#!/bin/bash

logfile=/var/log/apache2/error.log
searchstr='sigkill\|reached maxclients'
cachefile='/var/cache/lastpos-apache2-scan4maxclntOrSigKill'

[ -f $cachefile ] && lastpos=$(<$cachefile)
[ "$lastpos" ] || lastpos=0

newpos=$(stat -c %s $logfile)

[ $lastpos -gt $newpos ] && lastpos=0

tail -c +$lastpos $logfile | grep "$searchstr"

echo $newpos >$cachefile

答案3

总是有Perl,例如:

perl -ne 'print if m/sigkill|reached maxclients/i' /var/log/apache2/error_log

答案4

Monit 是一款非常轻量级的系统监控工具,它会监视日志文件并在出现某些字符串时发送警报。请参阅以下文档:http://mmonit.com/monit/documentation/monit.html#file_content_testing以供使用。

相关内容