目录

一、先搞懂:ELK/EFK 各组件到底干什么?

1. 核心组件分工

2. 为什么 Java 生产必须用 ELK?

二、Java 生产环境标准部署架构(直接照抄)

1. 小型项目(单节点)

2. 生产标准架构(高可用)

三、第一步:Java 应用日志规范(接入 ELK 的前提)

1. 推荐日志框架

2. 生产级 JSON 日志配置(Logback)

3. 依赖引入(pom.xml)

四、第二步:生产环境组件配置实战

1. Filebeat 配置(最关键,轻量采集)

2. Logstash 配置(日志清洗)

3. Elasticsearch 生产配置

4. Kibana 配置(可视化查询)

五、第三步:Java 生产环境 ELK 核心使用场景

1. 线上故障极速排查(最常用)

2. 微服务全链路监控

3. 实时业务监控

4. 安全审计

六、生产环境必做的优化(避坑指南)

1. ES 集群优化

2. 日志优化

3. 高可用保障

七、生产常见问题 & 解决方案

1. Java 服务 CPU 高

2. 日志丢失

3. 查询很慢

4. 磁盘爆满

八、总结:Java 生产 ELK 落地清单

关键点回顾


ELK 是Elasticsearch + Logstash + Kibana的组合(现在主流用Filebeat替代 Logstash 做日志采集,即EFK),是 Java 生产环境日志集中化管理、实时监控、故障排查、性能分析的标准解决方案。

我会从核心组件作用、Java 项目接入、生产部署架构、配置实战、运维优化、常见问题全流程讲透,直接落地可用。


一、先搞懂:ELK/EFK 各组件到底干什么?

生产环境绝对不直接用 Logstash 采集日志(耗 CPU / 内存),标准架构是:

Java应用 → Filebeat(轻量采集) → Logstash(过滤清洗) → Elasticsearch(存储检索) → Kibana(可视化)

1. 核心组件分工

组件 作用 生产环境关键点
Elasticsearch (ES) 分布式搜索引擎,存储 + 检索日志 集群部署、分片、副本、内存优化
Logstash 日志过滤、格式化、清洗 只做处理,不做采集
Kibana Web 可视化界面,查日志、做监控面板 权限控制、索引模式、告警
Filebeat 轻量级日志采集器(Go 语言) 替代 Logstash 采集,极低资源占用

2. 为什么 Java 生产必须用 ELK?

  1. 分布式日志乱套:微服务多节点,本地日志没法统一看
  2. 故障排查慢:线上报错要登录多台服务器翻日志
  3. 无实时监控:接口报错、OOM、慢查询无法及时发现
  4. 日志无法检索:grep 命令查日志效率极低,无法聚合分析

二、Java 生产环境标准部署架构(直接照抄)

1. 小型项目(单节点)

测试 / 小流量:1 台服务器部署全部组件

Java服务 → Filebeat → ES → Kibana

2. 生产标准架构(高可用)

中大型项目必用,无单点故障:

  • Filebeat:每台 Java 应用服务器都部署( sidecar 模式)
  • Logstash 集群:2~3 节点,做日志过滤
  • ES 集群:3 + 节点(主节点 + 数据节点分离)
  • Kibana 集群:2 节点,负载均衡

三、第一步:Java 应用日志规范(接入 ELK 的前提)

Java 日志必须用JSON 格式输出,ES 才能自动解析字段(接口名、耗时、异常、traceId)。

1. 推荐日志框架

Logback / Log4j2(SpringBoot 默认 Logback)

2. 生产级 JSON 日志配置(Logback)

logback-spring.xml 核心配置:

<!-- 输出JSON格式日志,给Filebeat采集 -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.json</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/app.%d{yyyy-MM-dd}.json</fileNamePattern>
        <!-- 保存7天日志 -->
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <!-- 自定义字段:服务名、环境、traceId -->
        <customFields>{"application":"order-service","profile":"prod"}</customFields>
        <!-- 开启微服务追踪ID -->
        <includeMdcKeyName>traceId</includeMdcKeyName>
        <includeMdcKeyName>spanId</includeMdcKeyName>
    </encoder>
</appender>

<!-- 根日志 -->
<root level="INFO">
    <appender-ref ref="JSON_FILE"/>
</root>

3. 依赖引入(pom.xml)

<!-- JSON日志格式化 -->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.4</version>
</dependency>

输出效果(标准 JSON,ES 直接解析):

{
  "@timestamp": "2025-01-01T12:00:00.000Z",
  "level": "ERROR",
  "message": "NullPointerException",
  "application": "order-service",
  "traceId": "a1b2c3d4e5f6",
  "thread": "http-nio-8080-exec-1"
}

四、第二步:生产环境组件配置实战

1. Filebeat 配置(最关键,轻量采集)

每台 Java 服务器都部署,只采集 JSON 日志,发送到 Logstash/ES

filebeat.yml 生产配置:

filebeat.inputs:
- type: filestream
  enabled: true
  paths:
    - /opt/java-app/logs/*.json  # Java日志路径
  json:
    keys_override_root: true  # 解析JSON字段
    add_error_key: true

# 输出到Logstash(推荐)
output.logstash:
  hosts: ["192.168.1.100:5044", "192.168.1.101:5044"]

# 输出到ES(简单架构直接用)
# output.elasticsearch:
#   hosts: ["http://es-node1:9200","http://es-node2:9200"]
#   index: "java-app-%{+yyyy.MM.dd}"

setup.kibana:
  host: "http://kibana:5601"

生产要点

  • 占用内存 < 100MB,不影响 Java 服务
  • 断点续传:日志文件滚动、服务重启都不会丢日志
  • 自动重试:ES/Logstash 挂了会缓存日志

2. Logstash 配置(日志清洗)

只做过滤、去重、字段加工,减轻 ES 压力

logstash.conf

input {
  beats {
    port => 5044  # 接收Filebeat数据
  }
}

# 过滤规则:Java日志优化
filter {
  # 解析JSON
  json {
    source => "message"
    remove_field => "message"
  }
  # 过滤掉不需要的字段
  mutate {
    remove_field => ["@version", "ecs", "log", "input", "agent", "host"]
  }
}

# 输出到ES集群
output {
  elasticsearch {
    hosts => ["http://es-node1:9200", "http://es-node2:9200"]
    # 按天创建索引,方便清理
    index => "java-%{[application]}-%{+yyyy.MM.dd}"
  }
}

3. Elasticsearch 生产配置

核心:防止内存溢出、控制磁盘占用

jvm.options(最重要!):

# ES内存设置:不超过32GB,不超过物理内存的50%
# 8G服务器 → -Xms4g -Xmx4g
# 16G服务器 → -Xms8g -Xmx8g
-Xms8g
-Xmx8g

elasticsearch.yml

cluster.name: java-prod-cluster
node.name: es-node1
network.host: 0.0.0.0
# 集群节点
discovery.seed_hosts: ["es-node1", "es-node2", "es-node3"]
cluster.initial_master_nodes: ["es-node1"]
# 禁止自动创建索引
action.auto_create_index: false

4. Kibana 配置(可视化查询)

kibana.yml

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://es-node1:9200"]
# 中文界面
i18n.locale: "zh-CN"

使用步骤

  1. 创建索引模式java-*-*
  2. 在「Discover」页面实时查看 Java 日志
  3. 制作监控面板:接口 QPS、错误率、响应时间
  4. 设置告警:ERROR 日志超过阈值自动发钉钉 / 邮件

五、第三步:Java 生产环境 ELK 核心使用场景

1. 线上故障极速排查(最常用)

  • 搜索:level:ERROR AND application:order-service
  • 按 traceId 搜索:一次请求全链路日志
  • 看异常栈:直接定位代码行

2. 微服务全链路监控

搭配SkyWalking/Pinpoint,用traceId串联所有服务日志:

  • 订单→支付→库存服务,一次请求全日志一目了然

3. 实时业务监控

Kibana 面板:

  • 接口调用量
  • 错误率(5xx/4xx)
  • 平均响应时间
  • 慢接口排行

4. 安全审计

记录登录日志、敏感操作日志,长期留存,支持回溯


六、生产环境必做的优化(避坑指南)

1. ES 集群优化

  1. 内存Xms = Xmx,不超过 32GB
  2. 索引分片:单分片大小30~50GB,每天一个索引
  3. 副本数:生产设置 number_of_replicas: 1(高可用)
  4. 生命周期:7 天日志自动删除,节省磁盘

2. 日志优化

  1. 禁止打印敏感数据:密码、身份证、手机号
  2. 控制日志量:不打印大量无用 debug 日志
  3. JSON 格式:必须结构化,不要纯文本

3. 高可用保障

  1. ES 集群 ≥3 节点,避免脑裂
  2. Filebeat 部署在每台应用服务器,无单点
  3. Kibana 多节点 + Nginx 负载均衡

七、生产常见问题 & 解决方案

1. Java 服务 CPU 高

  • 排查:Filebeat 占用低,基本排除;看 ES 查询压力
  • 解决:优化 Logstash 过滤规则,减少 ES 压力

2. 日志丢失

  • 原因:Filebeat 配置错误、ES 磁盘满
  • 解决:检查 Filebeat 日志、清理 ES 索引

3. 查询很慢

  • 原因:索引太大、分片不合理
  • 解决:按天拆分索引、增加 ES 节点

4. 磁盘爆满

  • 解决:配置 ES 索引生命周期,7 天自动删除

八、总结:Java 生产 ELK 落地清单

  1. 架构:Java → Filebeat → Logstash → ES → Kibana
  2. 日志:Java 输出JSON 格式,带 traceId
  3. 部署:ES 集群化,Filebeat 每台服务器部署
  4. 优化:ES 内存不超过物理内存 50%,按天拆分索引
  5. 使用:故障排查、全链路监控、实时告警

ELK 是 Java 生产环境标配,掌握这套方案,线上日志问题、故障排查效率提升 10 倍以上。


关键点回顾

  1. 生产用 EFK:Filebeat 替代 Logstash 采集日志,资源占用极低
  2. Java 必须输出 JSON 日志,ES 才能结构化检索
  3. ES 集群是核心:内存、分片、副本、生命周期必须优化
  4. Kibana 负责可视化 + 告警,实现日志可视化监控
  5. 整套方案解决:分布式日志混乱、故障排查慢、无实时监控三大痛点
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐