在单个Linux服务器上,通常有许多独立的(可能是相互关联的)服务,以众所周知的path将许多日志输出到文件中。
有时坏的东西发生,并写入日志。 有时服务会被锁住,而日志不会(或者很less)有新的条目。
使用一个工具/服务/系统来监视这两种事件的最简单的方法是什么?
我不知道这是否是“最简单的方法”,但我认为这是正确的方法:使用警报/监控系统/服务,如Nagios,Zabbix,Zenoss或其他类似的工具。 他们将监视您的服务器的指定参数(进程正在运行/活动,端口接受连接,日志文件中的活动,日志文件的内容),并根据规则(提醒您,重新启动服务等)执行操作。
现在有一个Nagios日志监控插件可用。 请参阅以下链接:
Nagios日志监视
仔细阅读,看看这是你想要的。
你的第一个问题 监视string/正则expression式的日志:
根据我在该页面上使用的logrobot工具的经验,我知道监视任何types的日志不是一个问题,不pipe日志格式。 在该页面上使用的示例应该肯定这一点。
你的第二个问题; 监视日志以确保有输出:
现在还要监视并警示是否有任何输出,这也是可能的。 我正试图从我头顶上想出如何做到这一点。 但试试这个:
logrobot autonda / log / file / path 60m'。' '' 2 2 maxclient -ndnotfoundn
logrobot =工具的名称
autonda =要用于您的scheme的function
/ log / file / path =日志文件的path
60m =如果最后一次修改文件的时间超过60米,则工具不会再进一步。
'' =这是在日志文件中search任何东西
'' =这是在日志文件中search任何东西
2 =如果至less有两行没有find,警报
maxclient =你给这个会话的名字。 你可以打电话给你想要的任何东西。
-ndnotfound =这是您传递给该工具的选项
您当然可以更改参数以适合您的特定需求。
SNMP(Nagios Net-Snmp)非常好,但是设置正确的话很痛苦。 如果你想最小的成本考虑使用cron作业 – 你写在bash脚本,cron定期提交。
不活动:
创build一个像这样的目录和日志文件名的文件,例如:list.txt,这些都是伪装的例子。 列是path日志文件名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
创build另一个文件,list1.txt,列文件文件规范和正则expression式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 -einput你想要的作业运行时间:工作日每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