在 Debian 上运行 Golang 服务时,“日志告警”通常分三层来做:
下面按常见实用方案给你讲。
例如 error 级别日志直接发告警:
log.Println("normal log")
if err != nil {
log.Printf("ERROR: %v", err)
sendAlert("服务异常", err.Error())
}
func sendDingding(msg string) {
url := "https://oapi.dingtalk.com/robot/send?access_token=xxx"
body := map[string]interface{}{
"msgtype": "text",
"text": map[string]string{
"content": msg,
},
}
jsonBody, _ := json.Marshal(body)
http.Post(url, "application/json", bytes.NewReader(jsonBody))
}
func sendWechat(msg string) {
url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"
body := map[string]interface{}{
"msgtype": "text",
"text": map[string]string{
"content": msg,
},
}
jsonBody, _ := json.Marshal(body)
http.Post(url, "application/json", bytes.NewReader(jsonBody))
}
Golang 程序用 systemd 管理:
# /etc/systemd/system/myapp.service
[Unit]
Description=My Golang App
[Service]
ExecStart=/opt/myapp/myapp
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
查看错误日志:
journalctl -u myapp -p err
journalctl -u myapp -f | grep --line-buffered "ERROR" | while read line
do
curl -X POST https://xxx -d "$line"
done
适合 Kubernetes / 服务器集群
示例告警:
{job="myapp"} |= "ERROR"
/var/log/myapp.log# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
}
如果你愿意,可以告诉我:
我可以直接给你一套可复制的配置。