以下几种方法可用于为CentOS系统中的Golang应用程序实现日志告警:

许多第三方日志库都提供告警功能,例如logrus和zap。此类库一般内置告警能力,满足特定条件后即可发送通知。
以logrus为例,可借助logrus-hooks库完成告警功能:
go get github.com/sirupsen/logrusgo get github.com/iancoleman/strcase随后在代码中使用logrus和logrus-hooks:
package mainimport ("github.com/sirupsen/logrus""github.com/iancoleman/strcase""github.com/iancoleman/strcase/hooks")func main() {logrus.SetFormatter(&logrus.JSONFormatter{})logrus.AddHook(hooks.NewEmailHook("[email protected]",[]string{"[email protected]"},"logrus.LevelError","Application Error",func(entry *logrus.Entry) string {return strcase.ToLowerCamel(entry.Data["message"].(string))},))logrus.WithFields(logrus.Fields{"animal": "walrus","size": 10,}).Error("A walrus appears")}实时监控日志并设置告警规则,可借助Prometheus、Grafana或ELK(Elasticsearch、Logstash、Kibana)堆栈等工具;为此,需要把Golang应用程序的日志发送给这些外部监控和告警工具。
例如,可使用logstash-logback-encoder库,向Logstash发送Golang应用程序的日志:
go get github.com/segmentio/go-logstash随后在代码中使用logstash-logback-encoder:
package mainimport ("github.com/segmentio/go-logstash""log""time")func main() {logstashURL := "http://localhost:5000"logstashEncoder := logstash.JSONEncoder{}logger := log.New(logrus.WriterLevel(), "", log.LstdFlags)logstashClient, err := logstash.New(logstashURL, logstashEncoder)if err != nil {log.Fatalf("Error creating logstash client: %v", err)}logger.SetOutput(logstashClient)for {logger.WithFields(logrus.Fields{"animal": "walrus","size": 10,}).Error("A walrus appears")time.Sleep(1 * time.Second)}}还可选用系统级告警工具,例如monit或nagios,对Golang应用程序的日志文件进行监控。检测到特定错误或警告时,这些工具便可发送通知。
例如,使用monit对日志文件进行监控:
sudo apt-get install monit# 安装monit新建一个名为/etc/monit/conf.d/golang-app.conf的配置文件:
check file golang-app-log with path /path/to/your/golang/app.logif status != 0 then alert [email protected]接着重启monit服务:
sudo systemctl restart monit这样,错误出现在日志中时,Golang应用程序的monit便会向指定电子邮件地址发送通知。