日志管理实战:ELK与Loki对比选型与落地实践

日志管理实战:ELK与Loki对比选型与落地实践

大家好,我是迪哥。日志管理是运维工作的核心,从 ELK 到 Loki,从日志收集到分析,从告警到可视化,我们经历了多种方案的演进。今天就聊聊日志管理的选型和落地经验。

日志管理方案对比

方案 适用场景 特点
ELK 功能完善,搜索能力强 资源占用较高
Loki 轻量级,与 Grafana 集成好 搜索能力相对较弱
EFK 云原生场景 基于 Elasticsearch
Splunk 企业级 商业软件,成本高

ELK 实战

架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                         ELK Stack                           │
├─────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │   Filebeat   │  │  Logstash    │  │ Elasticsearch│    │
│  │  日志收集    │  │  日志处理    │  │  日志存储    │    │
│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘    │
│         │                 │                 │              │
│         └─────────────────┴─────────────────┘              │
│                           │                                │
│                           ▼                                │
│                  ┌──────────────┐                         │
│                  │   Kibana     │                         │
│                  │   可视化      │                         │
│                  └──────────────┘                         │
└─────────────────────────────────────────────────────────────┘

Filebeat 配置

yaml 复制代码
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/*.log
      - /var/log/app/*.log

output.logstash:
  hosts: ["logstash:5044"]

Logstash 配置

conf 复制代码
input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{DATA:logger} - %{GREEDYDATA:message}" }
  }
  
  date {
    match => [ "timestamp", "ISO8601" ]
  }
  
  mutate {
    remove_field => [ "host", "agent", "ecs" ]
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "logs-%{+YYYY.MM.dd}"
  }
}

Loki 实战

架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                         Loki Stack                          │
├─────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │   Promtail   │  │    Loki      │  │   Grafana    │    │
│  │  日志收集    │  │  日志存储    │  │   可视化      │    │
│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘    │
│         │                 │                 │              │
│         └─────────────────┴─────────────────┘              │
└─────────────────────────────────────────────────────────────┘

Promtail 配置

yaml 复制代码
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: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: system
          __path__: /var/log/*.log

Loki 查询

logql 复制代码
# 查询特定服务的错误日志
{app="order-service", level="ERROR"} |= "exception"

# 查询过去1小时的日志
{job="system"} | time > 1h

# 统计错误数量
count_over_time({level="ERROR"}[1h])

对比选型

维度 ELK Loki
搜索能力 强大,支持全文搜索 较弱,基于标签匹配
资源占用 较高 较低
集成 与 Kibana 集成 与 Grafana 集成
存储 索引方式 压缩存储
适用场景 需要复杂搜索 云原生、轻量级

最佳实践清单

维度 最佳实践
选型 需要全文搜索用 ELK,轻量级场景用 Loki
收集 使用 Filebeat/Promtail 收集日志
存储 配置合理的保留策略
查询 使用结构化日志,方便查询
告警 配置基于日志的告警规则

说到日志管理,我家那只叫 Docker 的哈士奇最近学会了"日志记录"------每次拆完家都会留下一些毛发作为"日志",让我能追踪它的行动轨迹,这日志记录能力比我们的 ELK 还强 😂

我是迪哥,我们下期再见!

相关推荐
nJI74egg13 小时前
JavaEE初阶---《JUC 并发编程完全指南:组件用法、原理剖析与面试应答》
java·面试·java-ee
刮风那天4 小时前
Android AMS创建进程不用Binder而用Socket?
android·java·binder
小王C语言4 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
程序员老邢4 小时前
【技术底稿 37】Spring Boot 3.x 自动装配 “死锁” 排查:3 个注解实现条件化装配与 Mock 兜底
java·spring boot·后端·自动装配·rag·技术底稿
日月云棠4 小时前
JAVA数据结构与算法 - 基础:链表
java·后端
日月云棠4 小时前
JAVA数据结构与算法 - 基础:栈 (Stack) 深度解析
java·后端
xiguolangzi4 小时前
java使用Map映射遍历方法
java·后端
日月云棠4 小时前
JAVA数据结构与算法 - 基础:队列 (Queue) 全方位解析
java·后端
JAVA面经实录9174 小时前
Java集合大全终极手册(一)
java·开发语言