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,全程不落盘。
第一步:添加依赖
<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
}
}
注意事项
- Logstash 不可用时:TCP 直连会阻塞或失败。可配置
writeBufferSize、多个 destination 做故障转移,或改用异步 appender 包裹; - 与写文件并存:可以同时保留控制台/文件 appender,过渡期更稳妥;
- 结构化日志:LogstashEncoder 输出的 JSON 包含时间、级别、logger、MDC 等字段,无需再 grok。
观测云对照
更现代的链路是输出到 stdout 由观测云 DataKit 采集(容器场景),或应用通过 OpenTelemetry 上报日志/链路到观测云,避免应用与特定日志后端耦合。
常见问题(FAQ)
Q:UDP 和 TCP 选哪个?
A:TCP 可靠。UDP 快但丢消息无感知,只用于可容忍丢失的高频日志。
Q:Logstash 挂了应用会卡住吗?
A:默认同步 appender 会阻塞。用 AsyncAppender 包裹或设置队列缓冲,防止影响业务。
Q:JSON 里的字段能自定义吗?
A:LogstashEncoder 支持 customFields、includeMdc、includeCallerData 等配置项。