如何高效使用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 功能代替频繁刷新 |
---
