在 CentOS 上配置 Golang 日志告警,是许多开发者都会遇到的典型需求——程序明明在持续写入日志,可一旦出现异常,却常常无人知晓。今天我们就来探讨一套切实可行的方案:如何用 Golang 自身输出日志,再结合轻量级的监控脚本,实现自动告警通知。整个流程并不复杂,但每个环节都有值得注意的细节。

-
编写 Golang 程序:首先解决日志输出的问题。核心思路是让 Golang 程序将运行信息写入一个固定文件,而不是仅打印到终端。下面的示例代码会打开(或创建)
app.log文件,并通过log.SetOutput将日志重定向到该文件——这样一来,所有log.Println的内容都会持久化到磁盘。循环中每 5 秒写入一条消息,模拟真实的业务场景:package main import ( "log" "os" "time" ) func main() { logFile, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { log.Fatalf("error opening log file: %v", err) } defer logFile.Close() log.SetOutput(logFile) for { log.Println("This is a log message") time.Sleep(5 * time.Second) } } -
监控日志文件:日志已经持续写入,但如何实时发现异常?传统做法是使用
tail -f——它会持续输出文件的新增行,非常适合作为实时监控的入口。只需在后台运行即可:tail -f app.log & -
设置告警机制:仅仅观察输出是不够的,必须让系统自动“呼叫”负责人。编写一个简单的 Bash 脚本,通过
tail -f每输出一行内容,就交给grep检查是否包含预设的关键词(例如ERROR)。一旦匹配成功,立刻发送邮件通知。以下脚本将目标关键词、日志文件路径和收件邮箱都定义为变量,方便后期调整:#!/bin/bash LOG_FILE="app.log" ALERT_EMAIL="your_email@example.com" ALERT_KEYWORD="ERROR" tail -f $LOG_FILE | while read line; do if echo "$line" | grep -q "$ALERT_KEYWORD"; then echo "Alert: Found keyword '$ALERT_KEYWORD' in log file at $(date)" | mail -s "Log Alert" $ALERT_EMAIL fi done保存为
log_monitor.sh后,需要添加执行权限:chmod +x log_monitor.sh然后在后台启动它:
./log_monitor.sh & -
使用第三方工具:如果觉得手写脚本不够灵活,可以考虑 Prometheus + Grafana 这套组合方案。它们能够基于日志内容或指标配置更复杂的告警规则,通知方式也更加多样(支持邮件、钉钉、Slack 等)。适合日志量较大、需要统一管理的场景。
-
集成到系统服务:想要让程序随系统开机自动启动、稳定运行?可以使用 systemd 将 Golang 程序和监控脚本分别封装为服务。这样一来,管理更加方便,重启、查看状态都能通过
systemctl完成,比单纯用&后台运行更可靠。
以上就是为 CentOS 下的 Golang 日志添加告警功能的核心步骤。在实际落地时,告警关键词、触发阈值以及通知渠道都可以根据需求灵活调整。关键在于:日志必须落盘,监控必须持续,告警必须有人响应——任何一个环节缺失,整个链路就容易断裂。
