java项目通过logback输出json格式日志,经filebeat或socket发送至logstash解析,存入elasticsearch供kibana展示;需配置mdc注入traceid、es索引模板设keyword类型、kibana建仪表盘与告警。

Java 项目中用 Logback 接入 ELK(Elasticsearch + Logstash + Kibana)做日志统一收集,核心是把 Logback 日志输出转成结构化 JSON 格式,再通过 Logstash 拉取或接收,最终存入 Elasticsearch 供 Kibana 展示。关键不在“能不能”,而在“怎么让日志可检索、可关联、不丢数据”。
配置 Logback 输出 JSON 格式日志
Logback 默认输出纯文本,ELK 需要结构化字段(如 level、timestamp、traceId、service、message),所以必须用 logback-contrib 或 logback-json 等支持 JSON 的 appender。
- 推荐使用 logback-json(轻量、稳定、兼容性好),在 pom.xml 中引入:
然后在 logback-spring.xml 中配置 JSON encoder:
注意:%X{traceId} 依赖 MDC(Mapped Diagnostic Context),需在 WebFilter 或 Spring Interceptor 中注入 traceId(如用 Sleuth 或自定义 UUID)。
Logstash 接收并解析日志
Logstash 不直接读文件(性能差、易丢),推荐两种方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- TCP/UDP 输入:Logback 用 SocketAppender 发送到 Logstash;适合中小规模,配置简单但需保障网络可靠
- Filebeat + Logstash:Filebeat 监控 JSON 日志文件,轻量采集 + 断点续传,再转发给 Logstash;生产环境更稳
Logstash 配置示例(以 Filebeat 输入为例):
input {beats {
port => 5044
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
date {
match => ["timestamp", "ISO8601"]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["http://es-host:9200"]
index => "java-logs-%{+YYYY.MM.dd}"
}
}
确保日志上下文可追踪
单体或微服务下,日志分散在多个实例,靠时间+关键字查很痛苦。必须注入唯一标识:
- HTTP 请求入口处生成 traceId(如 UUID 或 Snowflake ID),放入 MDC
- 下游调用时透传(Header 或 Dubbo attachment),Feign/Ribbon/OkHttp 均可拦截注入
- 异步线程(如 @Async、CompletableFuture)需手动 copy MDC,否则 traceId 丢失
- Logback pattern 中显式写入 %X{traceId} 和 %X{spanId} 字段,Logstash 解析后作为 ES 的 keyword 字段建索引
Kibana 可视化与告警基础
ES 索引建好后,在 Kibana 中:
- 创建 Index Pattern(如 java-logs-*),映射 timestamp 为 @timestamp 字段
- 用 Discover 查看实时日志,按 service、level、traceId 过滤
- 建 Dashboard:错误率趋势(count where level=ERROR / total)、慢请求 TopN(duration > 1000ms)、高频异常关键词统计
- 设 Alert:比如 5 分钟内 ERROR 日志超 100 条,触发 Slack 或邮件通知
不复杂但容易忽略:ES 的 index template 要提前配好,避免字段类型被自动识别为 text(导致无法聚合),尤其 traceId、service、level 应设为 keyword。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










