在单个 Linux 服务器上,通常有许多独立的(可能相互链接的)服务将大量日志输出到已知路径下的文件中。
有时会发生一些不好的事情,并记录在日志中。有时服务会锁定,日志中没有(或可能很少)新条目。
使用一个工具/服务/系统来监控这两种事件的最简单方法是什么?
答案1
我不知道这是否是“最简单的方法”,但我认为这是正确的方法:使用警报/监控系统/服务,例如 Nagios、Zabbix、Zenoss 或任何其他 100 种类似工具。它们将监控您的服务器的指定参数(进程正在运行/活动、端口接受连接、日志文件中的活动、日志文件的内容)并根据规则执行操作(提醒您、重新启动服务等)。
答案2
现在有一个 Nagios 日志监控插件可用。请参阅以下链接:
仔细阅读,看看是否是您想要的。
您的第一个问题;监控字符串/正则表达式的日志:
根据我的经验日志机器人该页面上使用的工具,我知道监控任何类型的日志都不是问题,无论日志格式如何。该页面上使用的示例应该可以证实这一点。
你的第二个问题;监视日志以确保有输出:
现在还可以监视和警告是否有任何输出,这也是可能的。我正在努力思考如何做到这一点。但是试试这个:
logrobot autonda /log/file/path 60m'.''.'2 2 maxclient -ndnotfoundn
日志机器人= 工具名称
奥通达= 适用于您的场景的功能
/日志/文件/路径= 日志文件的路径
60 分钟= 如果文件最后修改时间超过 60 分钟,该工具将不会再进行任何操作。
“。”= 这是在日志文件中搜索任何内容
“。”= 这是在日志文件中搜索任何内容
2= 如果至少有两行未找到,则发出警报
最大客户端= 您为本次会话指定的名称。您可以随意命名。
-ndnotfound= 这是您传递给工具的选项
当然,您可以更改参数以满足您的特定需求。
答案3
SNMP(Nagios Net-Snmp)非常好用,但设置起来却很麻烦。如果您想要最低成本,请考虑使用 cron 作业 - 您用 bash 编写脚本,cron 会定期提交该脚本。
不活跃:
创建一个文件,例如:list.txt,其中包含目录和日志文件名,如下所示,这些是假装的样本。列是路径日志文件名 max_hours_inactive:
/var/log syslog 9
/var/adm message 12
#!/bin/bash
# inactive.sh
while read path fname mxhrs
do
oops=$( /usr/bin/find $path -mtime +${mxhrs} -name $fname)
[ $#oops -gt 0 ] && echo "$fname inactive for $mxhrs" |/usr/bin/mailx -s "$fname warning"
done < /path/to/list.txt
创建另一个文件 list1.txt,其中包含列文件规范和正则表达式 EX:
/path/to/mylfile.log "(Warning|Fatal)"
#!/bin/bash
# error.sh
while read path regex
do
/usr/bin/egrep -q "$regex" $path &&
echo "$path has error notification" |/usr/bin/mailx -s "$path warning"
done < /path/to/list1.txt
使用 crontab-e 输入希望作业运行的时间,例如:工作日每 10 分钟运行一次,周末每小时运行一次
0,10,20,30,40,50 * * * 1-5 /path/to/error.sh >> /tmp/error.log.$(date +%Y%m%d) 2&>1
0 * * * 0,6 /path/to/error.sh >> /tmp/error.log.$(date +%Y%m%d) 2&>1
0,10,20,30,40,50 * * * 1-5 /path/to/inactive.sh >> /tmp/error.log.$(date +%Y%m%d) 2&>1
0 * * * 0,6 /path/to/inactive.sh >> /tmp/error.log.$(date +%Y%m%d) 2&>1