elk+rabbitmq+springboot日志系统搭建说明
一、环境部署
1、使用工具(xshell等)远程连接到110服务器,首先部署好 elk (ElasticSearch,logstash,kibana) 和 rabbitmq
elk和rabbitmq我先前已经在110服务器用docker部署好了,具体部署步骤自行查阅资料。(110服务器只是我当时使用的服务器地址,不用在意。)
2、进入logstash进行配置
如果创建logstash容器时使用 -v 绑定了某个卷,则不需要进入logstash容器内部。
- 使用命令进入容器 (“logstash”是创建该容器时自定义的容器名字)
docker exec -it logstash bash
- 成功进入后,进入config内查看 pipelines.yml 文件(7.0以下的旧版配置不在这里,建议使用新版)
- pipelines.yml文件中告诉了我们它启动是根据哪个路径的配置文件运行,我们找到对应的这个路径。
- 进入后我们看到其中有个默认的启动配置文件 logstash.conf(我已经给它加了个.backup后缀)
- 我们添加自己需要的配置,我这里已经添加好了 (logstash-mq.conf)
#日志信息会在项目中发送到mq中(下面会有在项目中的配置),我们要从mq中拿到日志信息
input {
#普通操作日志在下面配置的队列
rabbitmq {
type =>"operation"
durable => true
exchange => "log.exchange.direct"
exchange_type => "direct"
key => "log_operation"
host => "172.17.0.1"
port => 5672
user => "superadmin"
password => "admin2020"
queue => "QUEUE_LOG_OPERATION"
auto_delete => false
}
#上送指令的日志存在了下面配置的队列
rabbitmq {
type =>"upmsg"
durable => true
exchange => "log.exchange.direct"
exchange_type => "direct"
key => "log_up_msg"
host => "172.17.0.1"
port => 5672
user => "superadmin"
password => "admin2020"
queue => "QUEUE_LOG_UP_MSG"
auto_delete => false
}
#下发指令的日志存在了下面配置的队列
rabbitmq {
type =>"downmsg"
durable => true
exchange => "log.exchange.direct"
exchange_type => "direct"
key => "log_down_msg"
host => "172.17.0.1"
port => 5672
user => "superadmin"
password => "admin2020"
queue => "QUEUE_LOG_DOWN_MSG"
auto_delete => false
}
}
#我们要输出到es,把日志信息存在es中,不同日志发到不同的索引中
output {
#下发指令
if "downMsg" in [message]{
elasticsearch {
hosts => ["172.17.0.1:9200"]
index => "downmsg-log-%{+YYYY.MM.dd}"
}
}
#上送指令
else if "upMsg" in [message] {
elasticsearch {
hosts => ["172.17.0.1:9200"]
index => "upmsg-log-%{+YYYY.MM.dd}"
}
}
#普通操作指令
else {
elasticsearch {
hosts => ["172.17.0.1:9200"]
index => "operation-log-%{+YYYY.MM.dd}"
}
}
}
【说明】
-
input就是logstash是配置好的队列的消费者,从队列拿到数据后 output 输出到es中,它会把数据放到动态生成的索引中,你可以把索引当成数据库。logstash可以用来过滤数据, input -> filter -> output,当然我这里没有配置,以后有空我会写个更加详细的说明,更多花里胡哨的操作可以阅读logstash官方文档。
-
这里的 ip地址 172.17.0.1 你可以当作 110服务器中的docker容器之间沟通的地址,你也可以配成可以访问的ip加端口。
-
【message】字段存放的就是推送到mq中具体的日志信息,这个 “upMsg” in [message]就是判断这个字段中有没有“upMsg”字符串,后面我会说这个字符串哪里来的,通过这个我们将不同类型的日志放到不同索引中;”%{+YYYY.MM.dd}"这个很明显就是获取当天的日期了。每天的日志存在一个索引中。
(ps:你可能想说,这个判断能不能缩小范围,这样写好像重复了挺多代码,答案是不能,原因我还未找到。你还想说,这个“upmsg”索引名不是驼峰命名,那就注意了:es中的索引名只能小写。)
-
更多详细配置后续需要可以自行更改,例如 output 那里可以配置数据到了多少条批量输出到es。
- 之后我们使用exit命令退出容器并重启容器(restart),进入mq的管理界面,队列、交换机等都会自动生成给我们,当然你自己事先添加也可以。当数据量够了,就会在es中找到或者生成我们配置的索引并存放数据。
二、集成到SpringBoot项目
【添加配置】
1、logback依赖,在maven项目中引入下面这个依赖就会帮我们引入logback相关依赖,具体可以点进入去搜索一下。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
2、现在我们已经搭建好了基础环境,我们现在要把项目中的日志信息发送到mq中,我们需要添加一个配置
文件 logback-spring.xml,该文件在项目中的 common-web 模块的resource下(这只是我当时编写时的地方,不用在意),下面是日志写入mq的具体配置,这里的 appender 配置项要和刚才 input 中的配置信息相同。
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位默认单位是毫秒,当scan为true时此属性生效,默认时间间隔为1分钟
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration debug="true" scan="true" scanPeriod="30 seconds" packagingData="true">
<!-- <include resource="org/springframework/boot/logging/logback/base.xml" />-->
<conversionRule conversionWord="localConfig" converterClass="org.zxsg.common.config.LocalConfig"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<statusLis