Spring Boot 如何不落盘、直接把日志发送给 Logstash?

Spring Boot 直接发日志到 Logstash:添加 logstash-logback-encoder 依赖,logback-spring.xml 中配置 LogstashTcpSocketAppender 即可,日志以 JSON 格式经 TCP 直发。

最佳实践
Spring Boot 如何不落盘、直接把日志发送给 Logstash?封面

做法:引入 logstash-logback-encoder 依赖,在 logback 配置中添加 LogstashTcpSocketAppender,日志以 JSON 格式通过 TCP 直接发给 Logstash 的 TCP input,全程不落盘。

第一步:添加依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.4</version>
</dependency>

第二步:logback-spring.xml 配置

<configuration>
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>logstash-host:5000</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app":"my-service"}</customFields>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

第三步:Logstash 侧配置 TCP 输入

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

注意事项

  1. Logstash 不可用时:TCP 直连会阻塞或失败。可配置 writeBufferSize、多个 destination 做故障转移,或改用异步 appender 包裹;
  2. 与写文件并存:可以同时保留控制台/文件 appender,过渡期更稳妥;
  3. 结构化日志:LogstashEncoder 输出的 JSON 包含时间、级别、logger、MDC 等字段,无需再 grok。

观测云对照

更现代的链路是输出到 stdout 由观测云 DataKit 采集(容器场景),或应用通过 OpenTelemetry 上报日志/链路到观测云,避免应用与特定日志后端耦合。

常见问题(FAQ)

Q:UDP 和 TCP 选哪个?
A:TCP 可靠。UDP 快但丢消息无感知,只用于可容忍丢失的高频日志。

Q:Logstash 挂了应用会卡住吗?
A:默认同步 appender 会阻塞。用 AsyncAppender 包裹或设置队列缓冲,防止影响业务。

Q:JSON 里的字段能自定义吗?
A:LogstashEncoder 支持 customFieldsincludeMdcincludeCallerData 等配置项。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台