接上篇,上一篇已经配置了如何安装部署Loki + Promtail + Grafana收集日志与展示日志,接下里配置日志持久化存储以及日志告警。

1、创建数据存储目录,并设置好权限。

2、配置日志查询语句,用来检测过去 5 分钟内 ERROR 日志是否超过 5 条

sum(count_over_time({job="system-logs"} |= "ERROR" [5m])) > 5
部分 含义
{job="system-logs"} 筛选出所有 job="system-logs" 的日志(就是你的系统日志)
|= "ERROR" 日志内容中包含 ERROR 这个关键词(区分大小写)
[5m] 时间范围:过去 5 分钟
count_over_time(...[5m]) 统计这 5 分钟内有多少条日志
sum(...) 汇总(如果有多个来源,把它们加起来)
> 5 如果总数大于 5,就触发告警

3、配置触发速度恢复速度

4、第五步接入告警方式,我这选择钉钉通知告警

5、配置通知消息

6、测试验证

配置完成后测试一下看看能否发送消息到钉钉群

(1)、写入几条告警日志进行测试

echo "ERROR: 测试告警触发 - 模拟服务异常" >> /var/log/messages

(2)、点击测试

也可以在服务器上手动触发进行测试

curl -X POST \
  'https://oapi.dingtalk.com/robot/send?access_token=f35ed80e3e61c87451bbd4d2c0a492cd6c607a21288abaa029cbd93783cf0af6' \
  -H 'Content-Type: application/json' \
  -d '{
    "msgtype": "text",
    "text": {
      "content": "ERROR:这是一条测试消息"
    }
  }'

这个时候收到的告警有个超链接,默认地址可能打不开,需要改一下才行,改成真实地址

重启 Grafana 容器

docker compose restart grafana

(3). 重新触发一条告警,验证链接

发一条新的 ERROR 日志,等告警触发后,钉钉消息里的链接应该变成:

http://192.168.158.183:3001/alerting/list

点开就能正常跳转了。如果不生效的话,就得要进入容器里改了

进入 Grafana 容器:

docker exec -it --user root loki-grafana-1 /bin/bash

编辑配置文件:

vi /etc/grafana/grafana.ini

1. 找到 [server] 部分,修改 root_url

按 / 搜索 root_url

找到这一行:

;root_url = %(protocol)s://%(domain)s:%(http_port)s/

在下面新增一行

root_url = http://192.168.158.183:3001

2. 保存退出

3. 重启 Grafana:

docker compose restart grafana

更快的方法:用 echo 直接追加

如果 vi 用不惯,也可以用这个命令直接追加配置(覆盖默认值):

docker exec --user root loki-grafana-1 bash -c 'echo -e "\n[server]\nroot_url = http://192.168.158.183:3001" >> /etc/grafana/grafana.ini'

验证

重启后,发几条 ERROR 日志触发告警,看钉钉消息里的链接是否变成了 http://192.168.158.183:3001/alerting/list

这个时候直接点击钉钉群新收到的日志告警就能直达告警规则列表了

对于配置文件稍做了一些改动

promtail-config.yaml

[root@prometheus loki]# cat promtail-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
clients:
  - url: http://loki:3100/loki/api/v1/push
scrape_configs:
  - job_name: system
    static_configs:
      - targets: [localhost]
        labels:
          job: system-logs
          host: prometheus
          __path__: /var/log/{*.log,messages*}
  - job_name: docker
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 10s
    relabel_configs:
      - source_labels: [__meta_docker_container_name]
        regex: '/(.*)'
        target_label: container
      - source_labels: [__meta_docker_container_log_stream]
        target_label: stream
[root@prometheus loki]#

docker-compose.yaml

[root@prometheus loki]# cat docker-compose.yaml
version: "3.3"
networks:
  loki:
services:
  loki:
    image: grafana/loki:latest
    restart: always
    ports:
      - "3100:3100"
    volumes:
      - ./loki-data:/loki
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki
  promtail:
    image: grafana/promtail:latest
    restart: always
    volumes:
      - /var/log:/var/log
      - ./promtail-config.yaml:/etc/promtail/config.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock
      - ./promtail-positions:/tmp      # 新增:持久化采集进度
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki
  grafana:
    image: grafana/grafana:latest
    restart: always
    ports:
      - "3001:3000"
    volumes:
      - ./grafana-data:/var/lib/grafana
      - ./grafana-plugins:/var/lib/grafana/plugins   # 可选:插件持久化
    environment:
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_FEATURE_TOGGLES_ENABLE=alertingSimplifiedRouting,alertingQueryAndExpressionsStepMode
      - GF_SERVER_ROOT_URL=http://192.168.158.183:3001
      - GF_SERVER_SERVE_FROM_SUB_PATH=true
    entrypoint:
      - sh
      - -euc
      - |
        mkdir -p /etc/grafana/provisioning/datasources
        cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
        apiVersion: 1
        datasources:
        - name: Loki
          type: loki
          access: proxy
          orgId: 1
          url: http://loki:3100
          basicAuth: false
          isDefault: true
          version: 1
          editable: false
        EOF
        /run.sh
    networks:
      - loki
[root@prometheus loki]#

钉钉机器人配置

到这里日志采集、存储、展示、告警已全部跑通。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐