你盯着屏幕,一行行日志像瀑布一样刷过。突然,ERROR 这个词像一根针,狠狠扎进你的眼睛。心跳漏了一拍,脑子里只剩下一个念头:“完了,又出事了。”
这种瞬间的恐慌,每个运维工程师都懂。日志是系统的脉搏,是故障发生前最微弱的呻吟。但等我们手动去翻、去查,往往已经晚了。错误已经发生,用户已经投诉,损失已经造成。

有没有一种方法,能让系统自己尖叫着告知你“我疼”?就像给日志装上了一个永不眨眼的哨兵?当然有。答案就藏在几行看似简单的 Shell 脚本里。
让脚本替你盯紧每一行“危险信号”
别再被动等待了。主动出击,才是解决问题的王道。想象一下,有一个忠诚的助手,7×24小时盯着日志文件,只要出现任何“危险词汇”,它就会立刻跳起来,用最醒目的方式提醒你。
这个助手,就是 while 循环。它就像一个不知疲倦的读者,一行一行地,永远读下去。
!/bin/bash
企业级:实时监控,快速响应故障
LOG_FILE=”/var/log/app/application.log” ALERT_KEY=”ERROR|Failed|Exception”
告警关键字
实时跟踪日志,匹配关键字则输出告警
tail -f ${LOG_FILE} | while read line; do if echo ${line} | grep -Eqi “${ALERT_KEY}”; then
标准化告警输出:时间+关键字+日志内容
echo “$(date +%Y-%m-%d %H:%M:%S) [ALERT] 匹配关键字:${ALERT_KEY},内容:${line}” fi done
看,代码就这么短。但短小精悍的背后,是精准的设计。我们来拆开看看,这个“哨兵”是怎么工作的。
`tail -f` 这个命令太关键了。`-f` 参数的意思是“follow”,跟随。它不会像普通读取文件那样,读完就结束。它会一直**粘在**日志文件的末尾,只要有新内容写入,它就立刻捕获到。这就像给你的日志流装上了一根永不断开的数据吸管。
这根“吸管”里流出的每一行文字,都被 `while read line` 这个循环稳稳接住。`read line` 把每一行文本,赋值给一个叫 `line` 的变量。然后,循环体里的“安检程序”就启动了。
**真正的“火眼金睛”**,是 `grep -Eqi` 这一句。这可不是普通的查找。
`-E` 代表使用扩展正则表达式。这让我们的监控关键字变得超级灵活。例子里的 `ERROR|Failed|Exception`,中间的竖线 `|` 就是正则里的“或”。意思是,只要匹配“ERROR” **或者** “Failed” **或者** “Exception” 中的任意一个,都算命中。你可以随意添加,列如 `ERROR|CRITICAL|FATAL|Timeout`。
`-q` 是“安静”模式。`grep` 默认会把匹配到的整行内容打印出来。但在我们的 `if` 判断语句里,我们只关心“有没有匹配到”,不关心具体内容。`-q` 让它闭嘴,只通过返回值告知我们结果。
`-i` 是“忽略大小写”。这样,无论是大写的 `ERROR`,还是小写的 `error`,甚至是大小写混合的 `ErRoR`,都逃不过它的法眼。
一旦“安检”通过,发现危险品,脚本就会执行 `echo` 告警。注意这里的告警信息格式:`$(date +%Y-%m-%d %H:%M:%S) [ALERT] ...`。**带上准确的时间戳和明确的标签**,这太重大了!当告警信息涌入你的邮箱或监控平台时,你一眼就能知道“什么时间”、“发生了什么级别的告警”、“具体内容是什么”。这为后续的故障定位节省了大量时间。
别只让它“喊”,让它去“做”
脚本运行起来,屏幕上开始闪烁红色的告警信息。这很棒,但还不够。难道说你要一直盯着屏幕吗?当然不。我们可以让这个哨兵变得更机智,让它不仅能“发现敌情”,还能“自动拉响警报”,甚至“尝试反击”。
列如,让它发邮件: 在告警的 echo 语句后面,可以加上邮件命令。
echo "$(date +%Y-%m-%d %H:%M:%S) [ALERT] 匹配关键字:${ALERT_KEY},内容:${line}" | mail -s “应用异常告警!” your-email@company.com
列如,让它发个钉钉/企业微信消息: 调用一个 webhook 接口,把告警内容作为 JSON 发出去,你的手机立刻就会“叮”一声。
curl -s -X POST ‘你的机器人Webhook地址’ -H ‘Content-Type: application/json’ -d “{"msgtype": "text", "text": {"content": "告警:$line"}}”
再列如,让它尝试自动重启服务: 对于某些已知的、可以通过重启解决的瞬时报错,甚至可以加入自动恢复逻辑。(注意:这需要超级谨慎,做好各种判断和日志记录,避免雪上加霜)
echo “尝试自动恢复服务...”
systemctl restart your-application.service
echo “$(date) 服务重启完成。” >> /var/log/auto-recover.log
看到了吗?从被动查看到主动监控,再到自动响应,运维的层次感一下子就出来了。这个简单的 while 循环,就是你自动化运维大厦的第一块,也是最坚实的基石。
把它变成你武器库里最趁手的工具
这个脚本的价值,远不止监控应用日志。它的模式是通用的:持续监控一个数据流,发现特定模式,触发动作。这个思想可以应用到无数场景。
数据库慢查询日志里,突然出现大量 Query_time 超过 5 秒的记录?用这个脚本监控,立刻告警,DBA马上介入。
安全日志里,出现大量 Failed password 的 SSH 登录尝试?用这个脚本监控,并自动调用防火墙命令,封掉攻击源 IP。
你的批处理作业输出日志,是否包含 successfully completed?用这个脚本监控,一旦出现,就触发下一个流程的开始。

别再把时间浪费在重复、枯燥的日志翻阅上了。把确定性的规则交给机器,把不确定性的判断留给自己。 今天,就从把这个脚本部署到你的测试环境开始。调整好告警关键字,测试一下告警触发是否正常。
然后,你可以去泡杯咖啡,或者安心地处理更复杂的架构问题。由于你知道,有一个不知疲倦的哨兵,正忠实地为你站岗。当刺耳的告警声再次响起时,那不再是恐慌的源头,而是你提前发现、快速解决问题的胜利号角。
让脚本去看日志吧。你的眼睛,应该看向更远的未来。
