安装Logstash
我准备将Logstash安装在 /opt/server 文件夹下,我们已经创建了这个文件夹,所以直接解压文件(注意切换到root用户):
# 注意执行前使用 Ctrl + D 退出 elk 用户并使用root用户运行 # 来到安转包存放目录 cd /usr/local/src/ # 解压文件到指定文件夹 tar -zxvf logstash-7.17.7-linux-x86_64.tar.gz -C /opt/server/
同样来到 /opt/server 文件夹下,将 logstash-7.17.7 文件夹以及下面的文件的所有权授予给 elk:
cd /opt/server/ chown elk:elk -R logstash-7.17.7/
执行结果:
同样我们需要修改一下 config/logstash.yml 配置文件,需要修改的内容:
# 节点的名称,取一个好听的名字(需要取消注释) node.name: test-log # pipeline 配置文件的路径,可自行修改,最好是空文件夹(需要取消注释) path.config: /opt/server/logstash-7.17.7/config/conf/*.conf
同样为了避免内存不足的问题,我们需要修改一下 config/jvm.options 配置文件,在文件中添加这几行代码(参数可以根据自己的内存大小自行修改):
-Xms256m -Xmx256m -Xmn128m
加上后如图:
然后我们再到我们上面 path.config 后面配置的文件夹(我配置的文件夹是/opt/server/logstash-7.17.7/config/conf/)中创建一个 test-log.conf 文件,文件内容为:
input { tcp { mode => "server" port => 4560 } } filter {} output { elasticsearch { action => "index" hosts => ["192.168.3.233:9200"] index => "test-log" } }
文件中包含了以下几个模块:
- input:日志的输出来源,我们将暴露一个4560端口接收来自SpringBoot的日志
- filter:日志的过滤器,暂时不配置
- output:日志的输出目的地,我们将日志输出到elasticsearch中进行保存,如果有多个es可以在中括号当中填写多个,以逗号隔开,其中index配置的test-log即为存储日志用到的索引名称,可自行修改
然后我们切换到elk用户去启动logstash:
cd logstash-7.17.7/ su elk bin/logstash
看到这两个输出内容代表Logstash启动成功:
我们可以按照上面的方法将Logstash转换为后台运行:
nohup bin/logstash >> /dev/null &
编写SpringBoot项目
到现在为止我们已经完成了服务端的搭建,现在我们开始编写SpringBoot项目去整合到ELK当中
初始化SpringBoot项目
我们去到 https://start.spring.io/ 初始化一个SpringBoot项目,相信你们会操作这里就不再过多赘述:
修改代码
将项目导入到idea或则其他的开发工具,并在 pom.xml 里面多添加一个 logback 整合 logstash 的依赖:
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.3</version> </dependency>
如图:
然后我们来到 application.yaml 文件中添加下面几个配置:
server: port: 8080 log: # logstash 地址和端口,注意修改 logstash-host: 192.168.3.233:4560
接下来我们在 resources 目录下创建一个 logback-spring.xml 配置文件,其中的内容为:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 日志存放路径 --> <property name="log.path" value="logs/test-log"/> <!-- 日志输出格式 --> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/> <!-- 读取SpringBoot配置文件获取logstash的地址和端口 --> <springProperty scope="context" name="logstash-host" source="log.logstash-host"/> <!-- 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 系统日志输出 --> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/info.log</file> <!-- 循环政策:基于时间创建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志最大的历史 7天 --> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤的级别 --> <level>INFO</level> <!-- 匹配时的操作:接收(记录) --> <onMatch>ACCEPT</onMatch> <!-- 不匹配时的操作:拒绝(不记录) --> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <!-- 循环政策:基于时间创建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志最大的历史 60天 --> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤的级别 --> <level>ERROR</level> <!-- 匹配时的操作:接收(记录) --> <onMatch>ACCEPT</onMatch> <!-- 不匹配时的操作:拒绝(不记录) --> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 将日志文件输出到Logstash --> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!-- 获取logstash地址作为输出的目的地 --> <destination>${logstash-host}</destination> <encoder chatset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <!-- 系统模块日志级别控制 --> <logger name="com.greateme" level="info"/> <!-- Spring日志级别控制 --> <logger name="org.springframework" level="warn"/> <root level="info"> <appender-ref ref="console"/> </root> <!--系统操作日志--> <root level="info"> <appender-ref ref="file_info"/> <appender-ref ref="file_error"/> <appender-ref ref="logstash"/> </root> </configuration>
重点讲讲下面几行代码
<!-- 读取SpringBoot配置文件获取logstash的地址和端口 --> <springProperty scope="context" name="logstash-host" source="log.logstash-host"/>
这一行代码是用于读取 application.yaml 配置文件中的 log.logstash-host 属性,然后生成一个 logback 的属性,用于输出日志所用
<!-- 将日志文件输出到Logstash --> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!-- 获取logstash地址作为输出的目的地 --> <destination>${logstash-host}</destination> <encoder chatset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender>
这几行代码就是配置输出日志到logstash的代码
编写Controller
我们来创建一个Controller来测试输出一些日志:
TestLogController.java
package com.greateme.log.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 测试日志的Controller * </p> * * @author XiaoHH * @version 1.0.0 * @date 2023-04-26 22:59:13 * @file TestLogController.java */ @RestController public class TestLogController { /** * 获取日志输出对象 */ private static final Logger log = LoggerFactory.getLogger(TestLogController.class); /** * 测试输出log的访问方法 */ @GetMapping("/testLog") public String testLog() { log.error("测试输出一个日志"); return "success"; } }
编写完成后项目的目录结构为:
我们来启动项目,我们可以发现启动时就输出了八条日志:
我们来到kibana查询一下索引列表:
然后再看看里面的数据,发现的确新增了8条内容:
我们编写了一个Controller也会输出日志,我们访问试试:
上面日志输出成功了,我们再来看看es里面的数据:
同时也可以看到日志的内容可以看到我们自定义输出的日志:
代码仓库地址:
https://gitcode.net/m0_51510236/test-log
好了SpringBoot整合ELK就整合完毕了,以后再也不要一台台服务器登陆上去查看日志了,祝你们编码开心!