日志管理实战: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 还强 😂

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

相关推荐
像我这样帅的人丶你还5 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩6 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia6 小时前
Mybatis的日志输入
java
亦暖筑序8 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户2986985301411 小时前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao11 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿11 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰67512 小时前
字节跳动国际支付-后端开发-三面面经
java
Flittly12 小时前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
RainCity12 小时前
Java Swing 自定义组件库分享(十二)
java·笔记·后端