Spring Boot 如何不落盘、直接把日志发送给 Logstash?
Spring Boot 直接发日志到 Logstash:添加 logstash-logback-encoder 依赖,logback-spring.xml 中配置 LogstashTcpSocketAppender 即可,日志以 JSON 格式经 TCP 直发。
做法:引入 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
}
}
注意事项
- Logstash 不可用时:该 TCP appender 内置异步队列,默认队列满时丢事件,可配置等待策略与 ringBufferSize;writeBufferSize 不是持久队列,多个 destination 用于故障转移,无需再包一层异步 appender;
- 与写文件并存:可以同时保留控制台/文件 appender,过渡期更稳妥;
- 结构化日志:LogstashEncoder 输出的 JSON 包含时间、级别、logger、MDC 等字段,无需再 grok。
常见问题(FAQ)
Q:UDP 和 TCP 选哪个?
A:TCP 提供有序重传的字节流,UDP 可能丢数据报;TCP 也不等于日志已被后端持久保存,仍需设计缓冲和失败处理。
Q:Logstash 挂了应用会卡住吗?
A:LogstashTcpSocketAppender 已是异步,默认队列满时丢事件;若配置等待队列空位,调用方才可能等待。应测试断连、队列满与退出刷新,不能保证零丢失。
Q:JSON 里的字段能自定义吗?
A:LogstashEncoder 支持 customFields、includeMdc、includeCallerData 等配置项。