elk搭建与Springboot集成

1,801 阅读3分钟

一. 概述

在线上问题排查时,通过日志来定位是经常使用的手段之一,甚至是最有效的。

线上服务为了实现高可用往往采用多节点部署,又或者随着项目愈发复杂会考虑微服务架构,导致日志分散在不同的服务器上,导致排查一个问题,需要登录多台服务器,查询在其上的日志,非常繁琐且低效。

所以,此时我们需要一个统一的实时【日志服务】,将我们需要的日志全部收集在一起,并提供灵活的查询功能。一般来说,一个完整的日志服务,需要提供如下 5 个功能:

  • 1、收集 :能够采集多个来源的日志数据。
  • 2、传输 :能够稳定的把日志数据传输到日志服务。
  • 3、存储 :能够存储海量的日志数据。
  • 4、查询 :能够灵活且高效的查询日志数据,并提供一定的分析能力。
  • 5、告警 :能够提供提供告警功能,通知开发和运维等等。

二.安装

在centos7.6环境下安装。

1.资源下载

本文使用elk版本为7.5.1,elk三个产品均可以在官网下载。www.elastic.co/cn/download…

官网下载速度偏慢,本人使用华为的镜像站:mirrors.huaweicloud.com

elasticsearch:repo.huaweicloud.com/elasticsear…

kibana: repo.huaweicloud.com/kibana/7.5.…

logstash: repo.huaweicloud.com/logstash/7.…

2.开始安装

2.1 安装jdk

yum -y install java-1.8.0-openjdk.x86_64

2.2 安装elasticsearch

  1. 修改 /etc/security/limits.conf ,在此配置中增加以下内容
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
  1. 修改完成后同时使用命令修改配置
$ ulimit -n 65536

检查是否设置正确

$ ulimit -n
65536
  1. 修改 /etc/sysctl.conf ,增加如下内容
vm.max_map_count=655360

修改完成后,执行命令使配置生效

$ sysctl -p
  1. 配置
  • 解压
tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz
  • 编辑配置
$ vi config/elasticsearch.yml

修改以下配置

network.host: 0.0.0.0 #实现内网可访问
node.name: node-1       # 设置节点名称
cluster.initial_master_nodes: ["node-1"]    # 设置主节点

# 下列设置密码服务
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
  1. 启动

elasticsearch不能使用root账号启动,所以需要创建账号来启动elasticsearch

#linux创建新用户 
$ adduser elk

#给新建用户elk设置密码
passwd elk

#给新建用户elk对应权限
$ chown -R elk  /opt/elasticsearch-7.5.1

切换到新建用户下,执行启动命令

$ su elk

# 启动。通过 -d 参数,表示后台运行。
$ bin/elasticsearch -d
  1. 设置密码
$ bin/elasticsearch-setup-passwords interactive

记住elastic密码。登录使用

  1. 访问 http://服务器IP:9200后,会弹出账号密码输入框,用户名:elastic。密码:刚刚设置的密码。输入后返回如下 JSON 串,表示成功。
{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "j-YinjvOStidFGkAgnclCA",
  "version" : {
    "number" : "7.5.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
    "build_date" : "2019-12-16T22:57:37.835892Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

如果访问不成功,查看是否关闭防火墙

#查看防火墙状态
$ firewall-cmd --state

#关闭停止firewall
$ systemctl stop firewalld.service

禁止防火墙开机启动
$ systemctl disable firewalld.service

2.3 安装kibana

  1. 解压
$ tar -zxvf kibana-7.5.1-linux-x86_64.tar.gz
  1. 设置

进去kibana配置文件夹

$ cd kibana-7.5.1/config/

编辑kibana.yml配置文件 vim kibana.yml 输入如下信息

server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "${在设置es密码时输入的密码}"
  1. 启动
# kibana不能用root账户启动,切换到elk用户。
# 赋予权限
$ chown -R elk  /opt/kibana-7.5.1-linux-x86_64

# 切换用户
$ su elk

# 执行命令,后台启动 Kibana 服务。
$ nohup bin/kibana &

# 可以通过 nohup.out 日志,查看启动是否成功
  1. 访问 服务器IP:5601,出现用户名和密码
用户名:elastic
密码:${设置的密码}
  1. 成功后,即可访问到kibana页面

2.4 安装logstash

  1. 解压
$ tar -zxvf logstash-7.5.1.tar.gz
  1. 配置
# 进入目录
$ cd logstash-7.5.1/config

# 设置配置文件

$ vi logstash-sample.conf

配置文件为如下格式

# Sample Logstash configuration for creating a simple
# tcp -> Logstash -> Elasticsearch pipeline.

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "springboot-logstash-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "${设置的elastic密码}"
  }
}
  1. 启动
$ nohup bin/logstash -f config/logstash-sample.conf &

至此,elk搭建完成。下面介绍如何在Spring boot项目中将日志输出到elk

三.使用

1.Spring boot设置

1.1 新建logback-spring.xml文件,配置如下

<?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"/>
    <!--应用名称-->
    <springProperty name="APP_NAME" scope="context" source="spring.application.name"/>

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    
        <destination>${logstash服务器ip}:4560</destination>
        
        <!-- encoder必须配置,有多种可选 -->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "logLevel": "%level",
                        "serviceName": "${APP_NAME}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
        <connectionStrategy>
            <roundRobin>
                <!-- 轮询时间间隔-->
                <connectionTTL>5 minutes</connectionTTL>
            </roundRobin>
        </connectionStrategy>
    </appender>

    <logger name="com.alibaba.nacos.client.config.impl" level="OFF"/>


    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

1.2 加入依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.4</version>
</dependency>

1.3 启动spring boot 服务

2.elk设置

2.1 选择左侧顶部discover

  1. 然后在中间输入框中输入匹配,一般是日期前面的字符串,加上“*”,这个和logstash配置文件里面的。
springboot-logstash-*
  1. 点击下一步,选择“timestamp”

3.之后点击创建索引模式

4.之后再次访问discover即可


end