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,应用侧无需日志文件;网络 appender 的内存缓冲并不提供持久化保障。

第一步:添加依赖

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

7.4 要求 Logback 1.3+,不适用于仍使用 Logback 1.2 的默认依赖组合;请按 Spring Boot 管理的 Java、Logback、Jackson 版本选择兼容且受维护的 encoder 版本。

第二步: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 appender 内置异步队列,默认队列满时丢事件,可配置等待策略与 ringBufferSize;writeBufferSize 不是持久队列,多个 destination 用于故障转移,无需再包一层异步 appender;
  2. 与写文件并存:可以同时保留控制台/文件 appender,过渡期更稳妥;
  3. 结构化日志:LogstashEncoder 输出的 JSON 包含时间、级别、logger、MDC 等字段,无需再 grok。

常见问题(FAQ)

Q:UDP 和 TCP 选哪个?
A:TCP 提供有序重传的字节流,UDP 可能丢数据报;TCP 也不等于日志已被后端持久保存,仍需设计缓冲和失败处理。

Q:Logstash 挂了应用会卡住吗?
A:LogstashTcpSocketAppender 已是异步,默认队列满时丢事件;若配置等待队列空位,调用方才可能等待。应测试断连、队列满与退出刷新,不能保证零丢失。

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

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台