日志管理实战: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 还强 😂
我是迪哥,我们下期再见!