找回密码
 立即注册
首页 业界区 业界 Grafana Loki自动监控日志

Grafana Loki自动监控日志

摹熹 昨天 16:20
Grafana Loki 日志监控配置指南

1.jpeg

前言

在微服务架构中,日志收集和分析是运维的重要环节。本文介绍如何使用 Grafana Loki 搭建轻量级日志监控系统,并与传统的 ELK 技术栈进行对比。
Loki vs ELK 技术栈对比

架构对比

组件ELKLoki日志采集Logstash / FilebeatPromtail日志存储ElasticsearchLoki可视化KibanaGrafana核心差异

对比项ELKLoki索引方式全文索引仅索引标签(Label)存储占用高(原始日志 + 索引)低(压缩存储,索引小)资源消耗高(ES 需要大量内存)低(单机 256MB 可运行)查询方式Lucene 语法LogQL(类 PromQL)查询速度全文搜索快标签过滤快,全文搜索慢部署复杂度复杂(多组件协调)简单(3 个容器即可)学习成本较高较低(熟悉 Prometheus 更容易)与 Prometheus 集成需额外配置原生集成
2.jpeg

3.gif

选型建议

选择 ELK 的场景:

  • 需要复杂的全文搜索
  • 日志分析是核心业务需求
  • 有专门的运维团队
  • 服务器资源充足
选择 Loki 的场景:

  • 中小型项目,资源有限
  • 已使用 Prometheus + Grafana 监控体系
  • 主要需求是日志查看和简单过滤
  • 追求快速部署和低维护成本
系统架构
  1. ┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
  2. │  微服务应用   │ ──▶ │   日志文件   │ ──▶ │  Promtail   │ ──▶ │    Loki     │
  3. │ (Java/Go等) │     │ (.log files)│     │  (采集器)    │     │  (存储)      │
  4. └─────────────┘     └─────────────┘     └─────────────┘     └──────┬──────┘
  5.                                                                     │
  6.                                                                     ▼
  7.                                                             ┌─────────────┐
  8.                                                             │   Grafana   │
  9.                                                             │  (可视化)    │
  10.                                                             └─────────────┘
复制代码
环境准备


  • Docker 20.10+
  • Docker Compose 2.0+
  • 服务器内存 >= 2GB
目录结构
  1. /docker/
  2. ├── docker-compose.yaml
  3. ├── loki/
  4. │   └── loki-config.yaml
  5. └── promtail/
  6.     └── promtail-config.yaml
复制代码
配置文件

1. Loki 配置 (loki-config.yaml)
  1. auth_enabled: false
  2. server:
  3.   http_listen_port: 3100
  4.   grpc_listen_port: 9096
  5. common:
  6.   instance_addr: 127.0.0.1
  7.   path_prefix: /loki
  8.   storage:
  9.     filesystem:
  10.       chunks_directory: /loki/chunks
  11.       rules_directory: /loki/rules
  12.   replication_factor: 1
  13.   ring:
  14.     kvstore:
  15.       store: inmemory
  16. query_range:
  17.   results_cache:
  18.     cache:
  19.       embedded_cache:
  20.         enabled: true
  21.         max_size_mb: 100
  22. limits_config:
  23.   metric_aggregation_enabled: true
  24.   retention_period: 720h  # 日志保留 30 天
  25. schema_config:
  26.   configs:
  27.     - from: 2020-10-24
  28.       store: tsdb
  29.       object_store: filesystem
  30.       schema: v13
  31.       index:
  32.         prefix: index_
  33.         period: 24h
  34. pattern_ingester:
  35.   enabled: true
  36.   metric_aggregation:
  37.     loki_address: localhost:3100
  38. compactor:
  39.   working_directory: /loki/compactor
  40.   retention_enabled: true
  41.   delete_request_store: filesystem
  42. frontend:
  43.   encoding: protobuf
复制代码
配置说明:
配置项说明auth_enabled: false关闭认证,单机部署使用http_listen_port: 3100Loki HTTP API 端口path_prefix: /loki数据存储路径前缀retention_period: 720h日志保留 30 天store: tsdb使用 TSDB 存储引擎(Loki 3.x 推荐)schema: v13最新的 schema 版本embedded_cache内置查询缓存,提升查询性能compactor自动压缩和清理过期日志2. Promtail 配置 (promtail-config.yaml)
  1. server:
  2.   http_listen_port: 9080
  3.   grpc_listen_port: 0
  4. positions:
  5.   filename: /tmp/positions.yaml
  6. clients:
  7.   - url: http://loki:3100/loki/api/v1/push
  8. scrape_configs:
  9.   - job_name: xiaohashu
  10.     static_configs:
  11.       - targets:
  12.           - localhost
  13.         labels:
  14.           job: xiaohashu
  15.           __path__: /var/log/xiaohashu/*.log
  16.     pipeline_stages:
  17.       # 从文件名提取服务名: note.2025-07-01-0.log → service=note
  18.       - regex:
  19.           source: filename
  20.           expression: '(?P<service>[a-z-]+)\.\d{4}-\d{2}-\d{2}-\d+\.log$'
  21.       - labels:
  22.           service:
  23.       
  24.       # 从日志内容提取级别: INFO/WARN/ERROR/DEBUG
  25.       - regex:
  26.           expression: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} \[[^\]]+\] (?P<level>\w+)'
  27.       - labels:
  28.           level:
复制代码
配置说明:
配置项说明positions.filename记录读取位置,重启后继续读取clients.urlLoki 推送地址__path__日志文件匹配路径pipeline_stages日志处理管道regex + labels从文件名/内容提取标签日志格式示例:
  1. 2025-07-01 10:30:00.123 [main] INFO  com.example.Service - 启动成功
复制代码
经过 pipeline 处理后,会自动添加标签:

  • service=note(从文件名提取)
  • level=INFO(从日志内容提取)
3. Docker Compose 配置
  1. services:
  2.   loki:
  3.     image: grafana/loki:3.5.0
  4.     container_name: loki
  5.     ports:
  6.       - "3100:3100"
  7.     volumes:
  8.       - ./loki/loki-config.yaml:/etc/loki/local-config.yaml
  9.       - loki-data:/loki
  10.     command: -config.file=/etc/loki/local-config.yaml
  11.     restart: unless-stopped
  12.   promtail:
  13.     image: grafana/promtail:3.5.0
  14.     container_name: promtail
  15.     volumes:
  16.       - ./promtail/promtail-config.yaml:/etc/promtail/config.yaml
  17.       - /www/wwwroot/life_diary/logs:/var/log/xiaohashu:ro
  18.     command: -config.file=/etc/promtail/config.yaml
  19.     restart: unless-stopped
  20.     depends_on:
  21.       - loki
  22.   grafana:
  23.     image: grafana/grafana:11.4.0
  24.     container_name: grafana
  25.     ports:
  26.       - "3000:3000"
  27.     environment:
  28.       - GF_SECURITY_ADMIN_USER=admin
  29.       - GF_SECURITY_ADMIN_PASSWORD=admin123
  30.     volumes:
  31.       - grafana-data:/var/lib/grafana
  32.     restart: unless-stopped
  33.     depends_on:
  34.       - loki
  35. volumes:
  36.   loki-data:
  37.   grafana-data:
复制代码
关键配置说明:
配置说明loki-data:/lokiLoki 数据持久化,容器重启不丢失/www/wwwroot/life_diary/logs:/var/log/xiaohashu:ro挂载宿主机日志目录,:ro 表示只读grafana-data:/var/lib/grafanaGrafana 配置持久化depends_on服务启动依赖顺序部署步骤

1. 创建目录和配置文件
  1. mkdir -p /docker/loki /docker/promtail
  2. cd /docker
  3. # 创建配置文件(内容见上文)
  4. vim loki/loki-config.yaml
  5. vim promtail/promtail-config.yaml
  6. vim docker-compose.yaml
复制代码
2. 启动服务
  1. cd /docker
  2. docker-compose up -d
复制代码
3. 查看服务状态
  1. docker-compose ps
  2. docker-compose logs -f loki      # 查看 Loki 日志
  3. docker-compose logs -f promtail  # 查看 Promtail 日志
复制代码
4. 配置 Grafana 数据源


  • 浏览器访问 http://服务器IP:3000
  • 登录(默认 admin / admin123)
  • 左侧菜单 → ConnectionsData sources
  • 点击 Add data source → 选择 Loki
  • URL 填写:http://loki:3100
  • 点击 Save & Test,显示绿色 ✓ 表示成功
LogQL 查询语法

基础查询
  1. # 查看所有日志
  2. {job="xiaohashu"}
  3. # 按服务筛选
  4. {service="note"}
  5. {service="gateway"}
  6. # 按日志级别筛选
  7. {level="ERROR"}
  8. {level="WARN"}
  9. # 组合条件
  10. {service="note", level="ERROR"}
复制代码
关键字搜索
  1. # 包含关键字
  2. {job="xiaohashu"} |= "Exception"
  3. {service="note"} |= "NullPointer"
  4. # 不包含关键字
  5. {service="gateway"} != "health"
  6. # 正则匹配
  7. {job="xiaohashu"} |~ "user.*login"
复制代码
统计分析
  1. # 最近 5 分钟各服务错误数
  2. count_over_time({level="ERROR"}[5m]) by (service)
  3. # 每分钟日志量
  4. rate({job="xiaohashu"}[1m])
  5. # 错误率
  6. sum(rate({level="ERROR"}[5m])) / sum(rate({job="xiaohashu"}[5m]))
复制代码
常用运维命令
  1. # 启动所有服务
  2. docker-compose up -d
  3. # 停止所有服务
  4. docker-compose down
  5. # 重启单个服务
  6. docker-compose restart loki
  7. # 查看资源占用
  8. docker stats loki promtail grafana
  9. # 查看日志
  10. docker-compose logs -f --tail=100 loki
  11. # 清理旧数据(谨慎使用)
  12. docker volume rm docker_loki-data
复制代码
常见问题

1. Promtail CPU 占用高

刚启动时需要扫描历史日志,属于正常现象。等处理完历史数据后会降下来。
2. Grafana 连接 Loki 失败

检查 URL 是否正确,容器内部通信使用服务名 http://loki:3100,不是 localhost。
3. 看不到日志


  • 检查日志路径挂载是否正确
  • 检查 Promtail 日志:docker logs promtail
  • 确认日志文件名格式与 __path__ 匹配
4. 磁盘空间不足

调整 retention_period 缩短保留时间,或手动清理:
  1. docker-compose down
  2. docker volume rm docker_loki-data
  3. docker-compose up -d
复制代码
总结

Grafana Loki 相比 ELK 更加轻量,适合中小型项目和资源有限的场景。通过合理配置 Promtail 的 pipeline,可以自动提取服务名和日志级别,实现高效的日志查询和分析。
对于已经使用 Prometheus + Grafana 的团队,Loki 是日志监控的最佳选择,可以在同一个 Grafana 界面中同时查看指标和日志,大大提升排查问题的效率。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册