springboot+docker+ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

首先得有虚拟机,内存cpu不要太小,不然会崩,我在这上面直接崩了,害的我搞了老半天

 

安装docker,博客里边有docker教程

Linux 下 yum 安装 docker_aloneTK的博客-CSDN博客

1.安装ElasticSearch

# 此处使用的elasticsearch版本为7.6.0,后续的kibana和logstash也会使用该版本
docker pull elasticsearch:7.6.0

2.为elasticsearch创建网络

# 如果已经创建了网络,则省略该步骤
docker network create elastic

3.启动镜像

docker run -d \
--name elasticsearch \
--network elastic \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:7.6.0

4.验证启动状态,若出现如下的返回信息,则说明elasticsearch已经部署ok

curl 127.0.0.1:9200

 出现这个证明安装成功

5.接下来安装kibana

# 该命令可执行也可不执行,docker run的时候若没有镜像会自动pull镜像
docker pull kibana:7.6.0

启动容器

# 仅使用命令行启动

docker run -d \
--name kibana \
--network elastic \
-e ELASTICSEARCH_URL=http://elasticsearch:9200 \
-e I18N_LOCALE=zh-CN \
-p 5601:5601 \
kibana:7.6.0
参数说明:

# 指定容器的网络,与elasticsearch使用同一网络即可使用容器名称进行互通
--network elastic

# 指定elasticsearch的服务器地址,elasticsearch:9200表示容器名称:端口号
# 只有同一网络下容器才能使用此种方式互通
-e ELASTICSEARCH_URL=http://elasticsearch:9200

# 容器国际化设配置为简体中文
-e I18N_LOCALE=zh-CN

6.访问kibana界面: http://服务器地址:5601

 证明启动成功

6.安装Logstash(在这里遇见超级多的坑)

# 该命令可执行也可不执行,docker run的时候若没有镜像会自动pull镜像
docker pull logstash:7.6.0

7.启动容器

下面会给出两种启动的方式,看个人喜好去选择,都由我亲自实践,完全莫得bug!

# 1.直接启动容器,不映射配置文件
docker run -d -p 5043:5043 -p 5044:5044 --name logstash --network elastic logstash:7.6.0

# 2.待容器启动完成,进入容器中
docker exec -it logstah /bin/bash

# 3.为logstash安装json_lines插件
/usr/share/logstash/bin/logstash-plugin install logstash-codec-json_lines

# 4. 添加springboot.yml配置文件
========================================================================
vi /usr/share/logstash/pipeline/springboot.yml

# 输入端
input {
  #输入logstash时控制台打印  
  stdin { } 
  #为logstash增加tcp输入口,方便springboot接入
  #5044端口预留给filebeat输入logstah,此处开放5043端口,程序直接输入logstash
  tcp {
      mode => "server"
      host => "0.0.0.0"
      #从5043端口取日志
      port => 5043
      #需要安装logstash-codec-json_lines插件
      codec => json_lines
  }
}

#输出端
output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    #hosts中的地址应该写同一network下的容器名称
    hosts => ["http://elasticsearch:9200"]
    # 输出至elasticsearch中的自定义index名称
    index => "flow-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

========================================================================

# 5. 保存编辑好的yml配置文件,退出容器
exit

# 6.重启容器
docker restart logstash

以映射配置文件的方式启动

# 1.创建存放配置文件的文件夹
 sudo mkdir -p /docker/logstash/config/

# 2.创建配置文件(复制以下全部内容至命令行中)
sudo tee /docker/logstash/config/logstash.yml <<-'EOF'
# 输入端
input {
  #输入logstash时控制台打印  
  stdin { } 
  #为logstash增加tcp输入口,方便springboot接入
  #5044端口预留给filebeat输入logstah,此处开放5043端口,程序直接输入logstash
  tcp {
      mode => "server"
      host => "0.0.0.0"
      #从5043端口取日志
      port => 5043
      #需要安装logstash-codec-json_lines插件
      codec => json_lines
  }
}

#输出端
output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    #hosts中的地址应该写同一network下的容器名称
    hosts => ["http://elasticsearch:9200"]
    # 输出至elasticsearch中的自定义index名称
    index => "flow-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}
EOF

# 3.启动容器
docker run -d --name logstash \
-p 5043:5043 -p 5044:5044 \
--network elastic \
--privileged=true \
-v /docker/logstash/config/:/usr/share/logstash/pipeline/ \
logstash:7.6.0

# 4.待容器启动完成,进入容器中
docker exec -it logstash /bin/bash

# 5.为logstash安装json_lines插件
/usr/share/logstash/bin/logstash-plugin install logstash-codec-json_lines

# 6. 成功安装插件之后,退出容器
exit

# 7.重启容器
docker restart logstash
docker ps -a查看到并未启动成功,没有端口号

启动后的logstash日志

docker logs -f logstash

可能会报错

docker安装并启动logstash时内存不足

别惊慌别害怕

解决方法
修改jvm.options文件配置
首先查找jvm.options文件位置(每个服务器的位置可能不同)

find / -name jvm.options

 修改内存

找到-Xms  Xmx属性,修改成512m(我的默认为1g)

es的也改了

我的做法是把es的都是512m logstash是1024m 
因为我logstash改成512后安装logstash-codec-json_lines插件给我报内存不足

然后重启容器,我这是所有都重启了

docker start $(docker ps -a -q)

启动参数说明

# logstash 默认会给beats留下一下5044的端口,用作beats的日志收集
# 再开放一个5043端口,用作tcp的日志收集端口
-p 5043:5043 -p 5044:5044

# 获取宿主机文件操作权限,有此权限才能进行文件映射
--privileged=true

# /usr/share/logstash/pipeline/ 此路径是容器的配置文件路径,将其管道的配置
# 文件目录映射出来,方便自己添加自己的日志输入输出配置
-v /docker/logstash/config/:/usr/share/logstash/pipeline/

# 将启动后的容器加入elastic网段中,在同一网段中,容器互通只需要通过容器名称即可
--network elastic

然后就是springboot配置

pom.xml

        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.2</version>
        </dependency>

在resourse目录下新建logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--获取springboot的yml配置信息-->
    <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="/home"/>
    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <withJansi>false</withJansi>
        <encoder>
            <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
            <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) -- %boldMagenta([%thread]) %boldCyan(%logger) : %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--  日志发送至logstash  -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- logstash的服务器地址和通信端口 -->
        <destination>49.235.205.253:5043</destination>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- 在elasticsearch的index中追加applicationName字段  -->
            <customFields>{"applicationName":"${applicationName}"}</customFields>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="logstash"/>
        <appender-ref ref="console"/>
    </root>
</configuration>

写一个controller

/**
 * @author 
 */
@Api(tags = "用户模块")
@RestController
public class UserController {
    private final static Logger logger= LoggerFactory.getLogger(UserServiceImpl.class);
    @Resource
    private UserService userService;

    @ApiOperation("登录接口")
    @PostMapping("login")
    private ResultModel list(@RequestBody UserReqVo request){
        logger.info("登录校验开始 "+System.currentTimeMillis()+" ,params:{}",request);
        UserResVo userResVo = userService.selectUserOne(request);
        logger.info("登录校验结束 "+System.currentTimeMillis());
        return ResultModel.success(userResVo);
    }

}

启动调用

 

 

调用

 

 结束

感谢一位老哥,跟着他一路下来解决了很多问题

老哥博客

 Torture - 简书

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值