Log4j 如何与 Logstash 集成(Java 日志进 ELK)?

Log4j/Log4j2 与 Logstash 集成:推荐 logstash-logback-encoder(TCP 直发 JSON)或写文件由 Filebeat 采集。Log4j1 已废弃不建议新项目使用。本文对比各方案。

最佳实践
Log4j 如何与 Logstash 集成(Java 日志进 ELK)?封面

三种集成方式:一、Socket Appender 经 TCP/UDP 直发 Logstash;二、写日志文件,Filebeat 采集转发(最可靠);三、Log4j2 的 SocketAppender 配合 Logstash tcp input。新项目建议用 Log4j2 或 Logback,Log4j1 早已停止维护。

方案一:Logback/Log4j2 TCP 直发(JSON)

Logback 项目用 logstash-logback-encoder

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.4</version>
</dependency>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>logstash-host:5000</destination>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>

Logstash 侧:

input {
  tcp {
    port => 5000
    codec => json_lines
  }
}

方案二:写文件 + Filebeat 采集(生产推荐)

应用正常写日志文件,Filebeat 读取并转发:

filebeat.inputs:
  - type: log
    paths: [/var/log/myapp/*.log]
output.logstash:
  hosts: ["logstash-host:5044"]

优点:应用与日志后端解耦,Logstash 挂了不丢日志(文件还在),是生产环境更稳妥的拓扑。

方案三:Log4j2 SocketAppender

<Socket name="logstash" host="logstash-host" port="5000">
    <JsonLayout compact="true" eventEol="true"/>
</Socket>

观测云对照

省去整条 ELK 链路:Java 应用日志输出到 stdout(容器)或文件,观测云 DataKit 采集上报,Pipeline 解析,日志查看器检索,监控器告警——也可以用 OpenTelemetry 探针同时获得日志+链路+指标。

常见问题(FAQ)

Q:Log4j1 还能用吗?
A:Log4j1 已于 2015 年停止维护,且存在已知安全问题。新项目用 Log4j2 或 Logback。

Q:TCP 直发会阻塞应用吗?
A:同步 appender 在 Logstash 不可达时会阻塞/失败。生产环境用 AsyncAppender 包裹,或用方案二(文件+采集)。

Q:JSON 里想带 TraceID?
A:把 TraceID 放进 MDC(MDC.put("traceId", ...)),LogstashEncoder 会自动包含 MDC 字段。观测云 APM 探针可自动注入。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台