推荐的解决方案是什么:梳理 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以供使用。