# Loki 使用指南（日志查看）

本文说明在当前项目中如何使用 Loki 查看 Kubernetes 日志，包括 Grafana 查询、LogQL 常用语句、命令行验证与常见排错。

---

## 1. 日志链路说明

当前日志链路：

- Promtail 采集节点日志文件
- Loki 存储与检索日志
- Grafana 作为查询与展示入口

相关配置文件：

- `deploy/k8s/monitoring/promtail.yaml`
- `deploy/k8s/monitoring/loki.yaml`
- `deploy/k8s/monitoring/grafana.yaml`

---

## 2. 快速开始（Grafana 查看日志）

### 步骤 1：确认监控组件运行

```bash
kubectl get pods -n monitoring
```

至少应看到 `promtail`、`loki`、`grafana` 为 `Running`。

### 步骤 2：打开 Grafana

```bash
kubectl port-forward -n monitoring svc/grafana 3000:3000
```

浏览器打开：`http://localhost:3000`

默认账号密码（按现有配置）：

- 用户名：`admin`
- 密码：`change-me`

### 步骤 3：进入 Explore 查询

- 左侧菜单进入 **Explore**
- 数据源选择 **Loki**
- 时间范围建议先设为 **Last 6 hours** 或 **Last 24 hours**
- 输入 LogQL 查询并点击 **Run query**

---

## 3. 常用 LogQL 查询语句

### 3.1 全量日志

```logql
{job="kubernetes-pods"}
```

### 3.2 按命名空间过滤

```logql
{job="kubernetes-pods", namespace="juwan"}
```

### 3.3 按服务（app 标签）过滤

```logql
{job="kubernetes-pods", app="user-rpc"}
```

### 3.4 多服务联合过滤

```logql
{job="kubernetes-pods", app=~"user-rpc|snowflake|email-mq"}
```

### 3.5 按容器名过滤

```logql
{job="kubernetes-pods", container="user-rpc"}
```

### 3.6 关键字过滤（错误日志）

```logql
{job="kubernetes-pods", namespace="juwan"} |= "error"
```

### 3.7 多关键字正则过滤

```logql
{job="kubernetes-pods", namespace="juwan"} |~ "(error|panic|fatal|timeout)"
```

### 3.8 统计最近 5 分钟错误量（按 app）

```logql
sum by (app) (count_over_time({job="kubernetes-pods"} |~ "(?i)error|panic|fatal" [5m]))
```

---

## 4. 不经过 Grafana 的直连验证（Loki API）

用于区分“Grafana 查询问题”与“日志未入库问题”。

### 4.1 端口转发 Loki

```bash
kubectl port-forward -n monitoring svc/loki 3100:3100
```

### 4.2 查询是否有流数据

```bash
curl "http://127.0.0.1:3100/loki/api/v1/query_range?query={job=\"kubernetes-pods\"}&limit=10"
```

### 4.3 查询 app 标签流

```bash
curl "http://127.0.0.1:3100/loki/api/v1/query_range?query={job=\"kubernetes-pods\",app=~\".+\"}&limit=10"
```

如果 API 返回 `result` 非空，说明 Loki 已正常入库。

---

## 5. 常见问题与处理

### 问题 1：Grafana 显示 No logs found

建议按顺序检查：

1. 时间范围是否太短（先调大到 6h/24h）
2. 查询标签是否过窄（先用 `{job="kubernetes-pods"}`）
3. Promtail 是否正常运行并有 target
4. Loki API 是否能直接查到数据

### 问题 2：Promtail 有 Running 但仍无日志

重点检查：

- `promtail` targets 是否 `ready`
- 是否存在 `stat ... no such file or directory`
- 是否挂载日志目录（`/var/log` 与 `/var/lib/docker/containers`）
- 是否有足够 RBAC 权限（pods/nodes/namespaces 等）

### 问题 3：查不到某个服务日志

建议检查：

- 该服务 pod 是否在运行并产生日志
- `namespace` 与 `app` 过滤条件是否正确
- 先用 `namespace` 过滤，再逐步加 `app`、`container` 条件

---

## 6. 推荐查询习惯

1. 先粗后细：全量 -> namespace -> app -> container -> 关键字
2. 先看时间范围：避免默认 1h 漏查
3. 遇到空结果先用 Loki API 验证入库
4. 保存常用查询到 Grafana Dashboard，便于团队复用

---

## 7. 参考

- Loki 故障排查文档：`docs/loki-log-troubleshooting.md`
