MZmine 3终极指南:从质谱数据小白到分析专家的完全免费解决方案
2026/8/3 3:11:06
在微服务架构中,日志收集和分析是运维的重要环节。本文介绍如何使用 Grafana Loki 搭建轻量级日志监控系统,并与传统的 ELK 技术栈进行对比。
| 组件 | ELK | Loki |
|---|---|---|
| 日志采集 | Logstash / Filebeat | Promtail |
| 日志存储 | Elasticsearch | Loki |
| 可视化 | Kibana | Grafana |
| 对比项 | ELK | Loki |
|---|---|---|
| 索引方式 | 全文索引 | 仅索引标签(Label) |
| 存储占用 | 高(原始日志 + 索引) | 低(压缩存储,索引小) |
| 资源消耗 | 高(ES 需要大量内存) | 低(单机 256MB 可运行) |
| 查询方式 | Lucene 语法 | LogQL(类 PromQL) |
| 查询速度 | 全文搜索快 | 标签过滤快,全文搜索慢 |
| 部署复杂度 | 复杂(多组件协调) | 简单(3 个容器即可) |
| 学习成本 | 较高 | 较低(熟悉 Prometheus 更容易) |
| 与 Prometheus 集成 | 需额外配置 | 原生集成 |
选择 ELK 的场景:
选择 Loki 的场景:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 微服务应用 │ ──▶ │ 日志文件 │ ──▶ │ Promtail │ ──▶ │ Loki │ │ (Java/Go等) │ │ (.log files)│ │ (采集器) │ │ (存储) │ └─────────────┘ └─────────────┘ └─────────────┘ └──────┬──────┘ │ ▼ ┌─────────────┐ │ Grafana │ │ (可视化) │ └─────────────┘/docker/ ├── docker-compose.yaml ├── loki/ │ └── loki-config.yaml └── promtail/ └── promtail-config.yaml/* by 01130.hk - online tools website : 01130.hk/zh/formatcsql.html */ auth_enabled: false server: http_listen_port: 3100 grpc_listen_port: 9096 common: instance_addr: 127.0.0.1 path_prefix: /loki storage: filesystem: chunks_directory: /loki/chunks rules_directory: /loki/rules replication_factor: 1 ring: kvstore: store: inmemory query_range: results_cache: cache: embedded_cache: enabled: true max_size_mb: 100 limits_config: metric_aggregation_enabled: true retention_period: 720h # 日志保留 30 天 schema_config: configs: - from: 2020-10-24 store: tsdb object_store: filesystem schema: v13 index: prefix: index_ period: 24h pattern_ingester: enabled: true metric_aggregation: loki_address: localhost:3100 compactor: working_directory: /loki/compactor retention_enabled: true delete_request_store: filesystem frontend: encoding: protobuf配置说明:
| 配置项 | 说明 |
|---|---|
auth_enabled: false | 关闭认证,单机部署使用 |
http_listen_port: 3100 | Loki HTTP API 端口 |
path_prefix: /loki | 数据存储路径前缀 |
retention_period: 720h | 日志保留 30 天 |
store: tsdb | 使用 TSDB 存储引擎(Loki 3.x 推荐) |
schema: v13 | 最新的 schema 版本 |
embedded_cache | 内置查询缓存,提升查询性能 |
compactor | 自动压缩和清理过期日志 |
/* by 01130.hk - online tools website : 01130.hk/zh/formatcsql.html */ 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: xiaohashu static_configs: - targets: - localhost labels: job: xiaohashu __path__: /var/log/xiaohashu/*.log pipeline_stages: # 从文件名提取服务名: note.2025-07-01-0.log → service=note - regex: source: filename expression: '(?P<service>[a-z-]+)\.\d{4}-\d{2}-\d{2}-\d+\.log$' - labels: service: # 从日志内容提取级别: INFO/WARN/ERROR/DEBUG - regex: expression: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} \[[^\]]+\] (?P<level>\w+)' - labels: level:配置说明:
| 配置项 | 说明 |
|---|---|
positions.filename | 记录读取位置,重启后继续读取 |
clients.url | Loki 推送地址 |
__path__ | 日志文件匹配路径 |
pipeline_stages | 日志处理管道 |
regex+labels | 从文件名/内容提取标签 |
日志格式示例:
2025-07-01 10:30:00.123 [main] INFO com.example.Service - 启动成功经过 pipeline 处理后,会自动添加标签:
service=note(从文件名提取)level=INFO(从日志内容提取)services: loki: image: grafana/loki:3.5.0 container_name: loki ports: - "3100:3100" volumes: - ./loki/loki-config.yaml:/etc/loki/local-config.yaml - loki-data:/loki command: -config.file=/etc/loki/local-config.yaml restart: unless-stopped promtail: image: grafana/promtail:3.5.0 container_name: promtail volumes: - ./promtail/promtail-config.yaml:/etc/promtail/config.yaml - /www/wwwroot/life_diary/logs:/var/log/xiaohashu:ro command: -config.file=/etc/promtail/config.yaml restart: unless-stopped depends_on: - loki grafana: image: grafana/grafana:11.4.0 container_name: grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123 volumes: - grafana-data:/var/lib/grafana restart: unless-stopped depends_on: - loki volumes: loki-data: grafana-data:关键配置说明:
| 配置 | 说明 |
|---|---|
loki-data:/loki | Loki 数据持久化,容器重启不丢失 |
/www/wwwroot/life_diary/logs:/var/log/xiaohashu:ro | 挂载宿主机日志目录,:ro表示只读 |
grafana-data:/var/lib/grafana | Grafana 配置持久化 |
depends_on | 服务启动依赖顺序 |
mkdir -p /docker/loki /docker/promtail cd /docker # 创建配置文件(内容见上文) vim loki/loki-config.yaml vim promtail/promtail-config.yaml vim docker-compose.yamlcd /docker docker-compose up -ddocker-compose ps docker-compose logs -f loki # 查看 Loki 日志 docker-compose logs -f promtail # 查看 Promtail 日志http://服务器IP:3000http://loki:3100# 查看所有日志 {job="xiaohashu"} # 按服务筛选 {service="note"} {service="gateway"} # 按日志级别筛选 {level="ERROR"} {level="WARN"} # 组合条件 {service="note", level="ERROR"}# 包含关键字 {job="xiaohashu"} |= "Exception" {service="note"} |= "NullPointer" # 不包含关键字 {service="gateway"} != "health" # 正则匹配 {job="xiaohashu"} |~ "user.*login"# 最近 5 分钟各服务错误数 count_over_time({level="ERROR"}[5m]) by (service) # 每分钟日志量 rate({job="xiaohashu"}[1m]) # 错误率 sum(rate({level="ERROR"}[5m])) / sum(rate({job="xiaohashu"}[5m]))# 启动所有服务 docker-compose up -d # 停止所有服务 docker-compose down # 重启单个服务 docker-compose restart loki # 查看资源占用 docker stats loki promtail grafana # 查看日志 docker-compose logs -f --tail=100 loki # 清理旧数据(谨慎使用) docker volume rm docker_loki-data刚启动时需要扫描历史日志,属于正常现象。等处理完历史数据后会降下来。
检查 URL 是否正确,容器内部通信使用服务名http://loki:3100,不是localhost。
docker logs promtail__path__匹配调整retention_period缩短保留时间,或手动清理:
docker-compose down docker volume rm docker_loki-data docker-compose up -dGrafana Loki 相比 ELK 更加轻量,适合中小型项目和资源有限的场景。通过合理配置 Promtail 的 pipeline,可以自动提取服务名和日志级别,实现高效的日志查询和分析。
对于已经使用 Prometheus + Grafana 的团队,Loki 是日志监控的最佳选择,可以在同一个 Grafana 界面中同时查看指标和日志,大大提升排查问题的效率。