如何高效使用Grafana Loki进行日志监控与分析?

摘要:# Grafana + Loki 使用说明 > Loki 是轻量级日志聚合系统,通过 Grafana 进行查询和可视化 ## 目录 - [一、入口地址](#一入口地址) - [二、基本使用](#二基本
# Grafana + Loki 使用说明 > Loki 是轻量级日志聚合系统,通过 Grafana 进行查询和可视化 --- ## 目录 - [一、入口地址](#一入口地址) - [二、基本使用](#二基本使用) - [三、LogQL 查询语法](#三logql-查询语法) - [四、常用查询示例](#四常用查询示例) - [五、常用 Label](#五常用-label) - [六、常用功能](#六常用功能) - [七、告警规则配置](#七告警规则配置) - [八、统计表达式](#八统计表达式) --- ## 一、入口地址 | 环境 | 地址 | |------|------| | **Dev/QA/SIT** | https://grafana.ltpin.com/ | | **UAT/Prod** | https://grafana.ltpin.com/ | > 若无账号或看不到 Explore 菜单请联系运维开通 --- ## 二、基本使用 ### 2.1 访问 Loki ``` 登入 Grafana → 进入 Explore 页面 → 选择 Loki 数据源 → 输入表达式 ``` ### 2.2 界面说明 1. 左侧菜单选择 **Explore** 2. 顶部数据源下拉选择 **Loki** 3. 在查询框输入 LogQL 表达式 4. 点击 **Run query** 执行查询 --- ## 三、LogQL 查询语法 ### 3.1 查询结构 LogQL 查询由两部分组成: - **日志流选择器** - 选择要查询的日志流 - **日志管道** - 过滤和处理日志 ``` {日志流选择器} |日志管道 ``` ### 3.2 日志流选择器 通过 **Label** 选择日志流,支持多个 label 组合和正则表达式。 ```logql {app="rapidx-gateway"} {app=~"rapidx-.+", env="dev", host!="127.8.8.8"} ``` **操作符说明**: | 操作符 | 说明 | |--------|------| | `=` | 完全相等 | | `!=` | 不等于 | | `=~` | 正则表达式匹配 | | `!~` | 正则表达式不匹配 | **正则表达式示例**: ```logql {name =~ "mysql.+"} # 匹配 mysql 开头 {name !~ "mysql.+"} # 不匹配 mysql 开头 {name !~ "mysql-\d+"} # 不匹配 mysql-数字 格式 ``` ### 3.3 日志管道(过滤表达式) 日志管道附加到日志流选择器后面,用于过滤和处理日志。 **过滤运算符**: | 运算符 | 说明 | |--------|------| | `\|=` | 日志行**包含**字符串 | | `!=` | 日志行**不包含**字符串 | | `\|~` | 日志行**包含**与正则表达式匹配的内容 | | `!~` | 日志行**不包含**与正则表达式匹配的内容 | --- ## 四、常用查询示例 ### 4.1 基础过滤 ```logql # 1. 过滤 rapidx-gateway 包含 error 的日志 {app="rapidx-gateway"}|= "error" # 2. 过滤所有 rapidx 相关服务非 debug 日志 {app=~"rapidx.+"} != "debug" # 3. 过滤 rapidx-gateway 包含 error 但不包含 timeout 的日志 {app="rapidx-gateway"}|= "error" != "timeout" ``` ### 4.2 正则匹配 ```logql # 4. 忽略大小写查询 error {app="rapidx-gateway"}|~ `(?i)error` # 5. 过滤 rapidx-gateway 包含 error=xxx 的日志 {app="rapidx-gateway"} ~= `error=\w+` ``` ### 4.3 统计查询 ```logql # 6. 计算 rapidx-dev 命名空间过去五分钟内的所有日志行数 sum(count_over_time({namespace="rapidx-dev"}[5m])) ``` --- ## 五、常用 Label ### 5.1 K8s 环境 | Label | 说明 | |-------|------| | `env` | 环境(dev/qa/sit/uat/prod) | | `namespace` | K8s 命名空间 | | `app` | 应用名称 | | `container` | 容器名称 | | `pod` | Pod 名称 | **示例日志字段**: ``` app: rapidx-fund container: rapidx-fund detected_level: info filename: /var/log/pods/rapidx-qa-fund_rapidx-fund-xxx/... job: rapidx-qa-fund/rapidx-fund namespace: rapidx-qa-fund node_name: ip-10-17-1-18.ap-northeast-1.compute.internal pod: rapidx-fund-6b7967477c-trjmv service_name: rapidx-fund stream: stdout ``` ### 5.2 虚拟机环境 | Label | 说明 | |-------|------| | `env` | 环境 | | `app` | 应用名称 | | `host` | 主机 IP | **示例日志字段**: ``` app: market detected_level: info env: dev filename: /data/api/market-info.log host: 10.18.10.169 service_name: market ``` --- ## 六、常用功能 ### 6.1 上下文查看 点击日志行右侧的 **Show context** 按钮,可以查看该日志的上下文(前后日志)。 ### 6.2 Live 实时日志 类似 `tail -f` 功能,实时查看日志流: 1. 点击界面右上角的 **Live** 按钮 2. 开始实时流式查看日志 3. 再次点击停止 --- ## 七、告警规则配置 ### 7.1 基于日志的告警 可以基于 LogQL 创建告警规则: ```logql # 示例:生产环境 rapidx-engine 1分钟内 ERROR 日志数量 > 0 告警 count_over_time({env="prod",app="rapidx-engine"}|="ERROR"[1m]) > 0 ``` ### 7.2 告警配置步骤 1. 在 Explore 中编写好查询 2. 点击 **Make this the alert condition** 3. 配置告警阈值和通知渠道 --- ## 八、统计表达式 LogQL 日志统计类似 Prometheus 指标统计。 ### 8.1 常用统计函数 | 函数 | 说明 | |------|------| | `rate(log-range)` | 计算每秒的条目数 | | `count_over_time(log-range)` | 计算给定范围内每个日志流的条目数 | | `bytes_rate(log-range)` | 计算每个流每秒的字节数 | | `bytes_over_time(log-range)` | 计算给定范围内每个日志流使用的字节数 | | `sum` | 计算标签总和 | | `avg` | 计算标签的平均值 | | `min` | 选择标签中的最小值 | | `max` | 选择标签中的最大值 | | `stddev` | 计算标签的总体标准差 | | `stdvar` | 计算标签的总体标准方差 | | `count` | 计算向量中元素的数量 | | `topk` | 按样本值选择最大的 k 个元素 | | `bottomk` | 按样本值选择最小的 k 个元素 | | `sort` | 返回按样本值升序排序的向量元素 | | `sort_desc` | 返回按样本值降序排序的向量元素 | ### 8.2 统计查询示例 ```logql # 统计过去5分钟各应用的日志行数 sum by (app) (count_over_time({namespace="rapidx-dev"}[5m])) # 统计过去1小时 ERROR 日志最多的 Top 10 应用 topk(10, sum by (app) (count_over_time({env="prod"}|="ERROR"[1h]))) # 计算每分钟日志速率 rate({app="rapidx-gateway"}[1m]) ``` --- ## 九、最佳实践 | 场景 | 建议 | |------|------| | **日常排查** | 先用 Label 缩小范围,再用关键字过滤 | | **性能优化** | 尽量使用精确 Label 匹配,避免 `=~` 全局正则 | | **时间范围** | 查询大范围日志时限制时间范围,避免超时 | | **告警规则** | 使用 `count_over_time` 统计异常日志数量 | | **实时查看** | 使用 Live 功能代替频繁刷新 | ---