SpringBoot整合ELK实现日志监控
Logstash
简介
一个具备实时数据传输能力的管道。它可以将数据从输入端(Spring Boot 日志)传送到输出端(Es)。数据在 Logstash 中传输的过程中,可以加入过滤器 Filter,对数据进行过滤。
安装
可以使用 Docker 安装(不推荐)。
直接安装
下载地址:https://www.elastic.co/cn/downloads/logstash。这里使用的是
Logstash 7.10.2
、ElasticSearch 7.9.3
解压下载后的文件
切换到
config
目录,可以按照logstash-sample.conf
示例文件,添加连接的配置文件,这里新建logstash-springboot.conf
文件,这中类型的文件可以有多个。input
中相关的为外部程序日志输入需要连接到logstash的配置信息output.elasticsearch
中为logstash处理后输入到ElastcSearch中的配置信息elasticsearch.hosts
指定ES服务端的实际地址,如果集群,那么可以指定多个地址elasticsearch.index
指定生成的日志索引的名称。log-louchen-dev
后面为通配符的时间
input { tcp { mode => "server" host => "0.0.0.0" port => 4560 codec => json_lines } } filter { } output { elasticsearch { hosts => ["127.0.0.1:9200"] index => "log-louchen-dev-%{+yyyy.MM.dd}" } }
编辑
config/pipelines.yml
文件:pipeline.id
指定该管道idpath.config
指定ES和logstash连接的配置文件,也就是上一步新建的conf文件的绝对路径
- pipeline.id: log_dev path.config: "/Users/louchen/developEnviro/logstash-7.10.2/config/logstash-springboot.conf"
切换到
bin
目录,执行./logstash
- 打印如下内容,则代表启动成功
新建SpringBoot项目
pom依赖
首先创建一个 Spring Boot 工程,引入 web 依赖 和 logstash 相关的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--连接logstash相关依赖-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
创建日志配置文件
然后在 resources 目录下创建 logback-spring.xml
文件,也就是日志输出配置文件,SpringBoot默认的使用的logback
日志必须叫这个名字
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--应用名称-->
<property name="APP_NAME" value="logstash"/>
<!--日志文件保存路径-->
<property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
<contextName>${APP_NAME}</contextName>
<!--每天记录日志到文件appender-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>127.0.0.1:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
创建测试请求
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@GetMapping("/hello")
public String hello() {
logger.info("HelloController执行hello");
return "hello";
}
}
Kibana配置
- SpringBoot项目启动后,可以看到默认已经创建出索引文件
索引规则配置
需要在
kibana
中,创建一个索引规则:- 点击
堆栈管理
Stack Mangement
点击
索引规则
Index pattern然后创建索引规则
通过输入的
log-loucher-dev-*
过滤出一条匹配的索引选择时间参数作为
@timestamp
通配符字段,然后点击右下角的Create index pattern
创建的结果,可以看到索引的相关详细信息
- 点击
索引文档查看
点击
Discover
通过Refresh按钮进行数据的查看,左边可进行文档过滤
通过索引文档内容可以知道,SpringBoot中控制台每一个线程打印的每一行日志都会生成一个文档
- 文档中包含:时间、日志输出的结果信息、文档的版本、日志的级别、线程名、端口、执行的方法都全类名、文档id、文档索引名等