SpringBoot整合ELK做日志(超完整)

SpringBoot整合ELK做日志

环境准备

提前准备一台CentOS7,我的配置为 2c4g50g,为了方便,我会直接关闭服务器的防火墙,执行以下代码:

systemctl stop firewalld
systemctl disable firewalld

安装包准备

ELK安装包

本篇文章讲解用 elasticsearch-7.17.7,kibana-7.17.7,logstash-7.17.7 和 SpringBoot 搭建日志系统,可提前下载好安装包,可使用以下命令下载,没有wget可通过yum安装:

wget \
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz \
https://artifacts.elastic.co/downloads/kibana/kibana-7.17.7-linux-x86_64.tar.gz \
https://artifacts.elastic.co/downloads/logstash/logstash-7.17.7-linux-x86_64.tar.gz

下载完成后如图:

下载了elk安装包

如果需要安装 ik 分词器,可以使用以下命令下载:

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.7/elasticsearch-analysis-ik-7.17.7.zip

Java11安装包

因为要登陆Oracle账户进行下载,所以我这里没办法直接提供下载链接,需要去到下载界面:

https://www.oracle.com/java/technologies/downloads/#java11

点击这个进行下载:

点击下载JDK11

点击同意协议:

在这里插入图片描述

登陆账户即可下载:

在这里插入图片描述

软件安装

安装java11

我准备将java11安装在 /opt/environment 目录下,所以我们执行以下命令创建目录:

mkdir -p /opt/environment

然后将 jdk-11.0.19_linux-x64_bin.tar.gz 解压到 /opt/environment 目录下,执行以下命令:

tar -zxvf jdk-11.0.19_linux-x64_bin.tar.gz -C /opt/environment/

然后我们 /opt/environment/jdk-11.0.19/ 目录查看(版本不同目录可能不同):

在这里插入图片描述

随后我们需要配置环境变量,将下面代码加到 /etc/profile 文件的末尾:

# Set java environment
JAVA_HOME=/opt/environment/jdk-11.0.19
ES_JAVA_HOME=$JAVA_HOME
LS_JAVA_HOME=$JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME ES_JAVA_HOME LS_JAVA_HOME PATH

其中 ES_JAVA_HOME 变量是ElasticSearch要求的, LS_JAVA_HOME 是Logstash要求的,但是要注意 JAVA_HOME=/opt/environment/jdk-11.0.19 的目录是jdk的更目录,如果不同注意修改。添加成功后查看 /etc/profile 文件末尾几行:

在这里插入图片描述

使用以下命令使配置生效并检查java是否安装成功:

source /etc/profile
java -version

看到下面结果代表安装成功:

在这里插入图片描述

安装ElasticSearch

我准备将ElasticSearch安装在 /opt/server 文件夹下,所以我们创建这个文件夹:

mkdir -p /opt/server

然后我们解压 elasticsearch-7.17.7-linux-x86_64.tar.gz 文件到这个文件夹:

tar -zxvf elasticsearch-7.17.7-linux-x86_64.tar.gz -C /opt/server/

我们来到 /opt/server 目录可以查看到解压的结果:

在这里插入图片描述

因为es要求不能以root用户运行该应用,所以我们为es创建一个用户 elk,并将 elasticsearch-7.17.7 目录和下面所有文件的所有权转到用户elk上:

# 创建用户
useradd elk
# 将所有权赋予给elk用户
chown elk:elk -R elasticsearch-7.17.7

随后我们需要改一些系统的配置文件,更详细的说明相见我的es安装教程,这里我们就直接执行以下代码配置:

echo "elk hard nofile 65536" >> /etc/security/limits.conf
echo "elk soft nofile 65536" >> /etc/security/limits.conf
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
sysctl -p

因为我们内存不多,所以还需要改一下 es 当中的 config/jvm.options 配置文件,在文件中加上以下三行代码(参数可以根据自己的内存大小自行修改):

-Xms256m
-Xmx256m
-Xmn128m

加上后如图:

在这里插入图片描述

然后我们需要修改 config/elasticsearch.yml 配置文件,需要修改的内容

# 集群的名字,根据自己爱好取一个好听的名字(需要取消注释)
cluster.name: test-log
# 这个节点的名称,可以自行修改(需要取消注释)
node.name: node-1
# 本节点的IP地址,注意修改为自己的IP地址(需要取消注释)
network.host: 192.168.3.233
# ES的端口(需要取消注释)
http.port: 9200
# 填写IP地址即可(需要取消注释)
discovery.seed_hosts: ["192.168.3.233"]
# 都有哪些node,填写node的名字(需要取消注释)
cluster.initial_master_nodes: ["node-1"]

然后我们就可以切换到 elk 用户启动elasticsearch:

# 切换到elk用户
su elk
cd elasticsearch-7.17.7/
# 启动elasticsearch
bin/elasticsearch

看到这个代表启动成功:

在这里插入图片描述

可以尝试访问服务器,可以看到访问成功:

在这里插入图片描述

安装成功后我直接 Ctrl + C 退出运行,然后执行以下命令将其后台运行:

nohup bin/elasticsearch >> /dev/null &

安装Kibana

我准备将Kibana安装在 /opt/server 文件夹下,我们已经创建了这个文件夹,所以直接解压文件(注意切换到root用户):

# 注意执行前使用 Ctrl + D 退出 elk 用户并使用root用户运行
# 来到安转包存放目录
cd /usr/local/src/
# 解压文件到指定文件夹
tar -zxvf kibana-7.17.7-linux-x86_64.tar.gz -C /opt/server/

同样来到 /opt/server 文件夹下,将 kibana-7.17.7-linux-x86_64 文件夹以及下面的文件的所有权授予给 elk:

cd /opt/server/
chown elk:elk -R kibana-7.17.7-linux-x86_64/

执行结果:

在这里插入图片描述

此时我们需要修改 config/kibana.yml 配置文件,修改的内容为:

# kibana地址,注意修改为自己的服务器地址(需要取消注释)
server.host: "192.168.3.233"
# elasticsearch地址,注意修改为自己的es服务器地址(需要取消注释)
elasticsearch.hosts: ["http://192.168.3.233:9200"]
# 国际化地址修改为中文(需要取消注释)
i18n.locale: "zh-CN"

保存并退出后切换到elk用户并启动kibana

# 来到kibana目录
cd kibana-7.17.7-linux-x86_64/
# 切换到elk用户
su elk
# 启动kibana
bin/kibana

看到这个代表启动成功:

在这里插入图片描述

我们可以访问一下这个地址:

在这里插入图片描述

访问后我们可以点击左上角的三条杠然后点击开发工具,来到这个界面接下来会用到

在这里插入图片描述

同理我们退出运行后让kibanna进入后台运行

# 先使用 Ctrl + C 退出运行,然后让kibana后台运行
nohup bin/kibana >> /dev/null &

安装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就整合完毕了,以后再也不要一台台服务器登陆上去查看日志了,祝你们编码开心!

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Boot可以很容易地集成ElasticSearch作为日志存储,然后使用Logstash将日志Spring Boot应用程序传输到ElasticSearch,最后可以使用Kibana进行数据可视化。 以下是实现Spring Boot整合ELK的基本步骤: 1. 安装ElasticSearch,Logstash和Kibana。 2. 当Spring Boot应用程序运行时,将日志记录到文件中。 3. 使用Logstash配置文件来监控日志文件,并将数据发送到ElasticSearch。 4. 在Kibana中创建一个索引模式来解析ElasticSearch中的数据。 5. 创建仪表板和可视化,以显示日志数据。 下面是一个简单的Logstash配置文件,将日志文件发送到ElasticSearch: ``` input { file { path => "/path/to/spring-boot-app.log" sincedb_path => "/dev/null" start_position => "beginning" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} \[%{DATA:thread}\] %{DATA:class} - %{GREEDYDATA:logmessage}" } } } output { elasticsearch { hosts => [ "localhost:9200" ] index => "spring-boot-app-logs-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } } ``` 这个配置文件使用Grok来解析日志文件中的日志条目,并将其发送到ElasticSearch中的名为“spring-boot-app-logs”索引的索引中。stdout输出是可选的,它允许将数据输出到控制台进行调试。 在使用Logstash转发日志数据之前,确保运行ElasticSearch和Kibana,并且ElasticSearch集群和索引模式已经设置好。在Kibana中,您可以通过“索引模式”页面创建新的索引模式。在这个页面上,您需要指定ElasticSearch索引的名称模式,并为每个字段定义Type。 创建模式后,您可以使用可视化编辑器创建仪表板和可视化,以显示日志数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值