Springboot整合Logstash实现日志采集

摘要

  • 本文介绍如何在Springboot项目中整合LogStash实现日志采集

  • 本文基于Springboot2.7.x版本进行测试,Logstash版本为8.17.3

使用logstash日志插件

1
2
3
4
5
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.3</version> <!-- 版本号根据实际情况修改 -->
</dependency>

注意:
springboot2.7.x以下版本,建议使用logstash-logback-encoder的7.3以下版本。
springboot3.x.x以上版本,建议使用logstash-logback-encoder的7.4及以上版本。

  • logback-spring.xml中添加logstash配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{50}:类路径,最大显示50个字符 %M:方法名称 %L:行号 %msg:日志消息,%n是换行符-->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level [%X{userName}][%X{userLocale}] %logger{50} - %M - %L - %msg%n</pattern>
</encoder>
</appender>

<!-- logstash输出 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>161.189.78.202:4560</destination> <!-- logstash地址和端口 -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder" >
<timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern> <!-- 时间格式,这个是默认值 -->
<includeMdc>true</includeMdc> <!-- 默认true, true表示输出MDC信息 -->
<includeCallerData>true</includeCallerData> <!-- 默认false, true表示输出打印日志的类名、方法名、行号等信息 -->
<customFields>{"appname": "springboot-logstash-demo"}</customFields> <!-- 自定义字段 -->
</encoder>
</appender>

<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
  • 添加config/springboot-demo.conf配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
input {
tcp {
host => "0.0.0.0" # 监听任意地址
port => "4560" # 监听端口
mode => "server" # server模式
codec => json_lines # 使用json_lines格式
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch { # 输出到ES
index => "%{[appname]}-%{+YYYY-MM-DD}" # 索引名,按天分隔,这里使用变量appname作为索引名
hosts => ["https://10.250.0.239:9200"] # ES地址
user => "elastic" # ES用户名
password => "123456" # ES密码
ssl => true # 是否启用SSL,因为这里是https访问ES
ssl_certificate_verification => false # 禁用证书验证
}
}
  • 启动logstash

1
bin/logstash -f config/springboot-demo.conf --config.reload.automatic
  • logstash启动成功后,会输出类似如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"message" => "Tomcat started on port(s): 8088 (http) with context path '/springboot-logstash'",
"level_value" => 20000,
"appname" => "springboot-logstash-demo",
"level" => "INFO",
"logger_name" => "org.springframework.boot.web.embedded.tomcat.TomcatWebServer",
"@timestamp" => 2025-04-07T09:39:43.569Z,
"@version" => "1",
"thread_name" => "restartedMain",
"caller_class_name" => "org.springframework.boot.web.embedded.tomcat.TomcatWebServer",
"caller_file_name" => "TomcatWebServer.java",
"caller_method_name" => "start",
"caller_line_number" => 220,
"userName" => "admin", # MDC信息默认会打印
"userLocale" => "zh_CN"
}
  • 可以访问ES或者Kibana查看索引信息,这里不再赘述。