从0开始进行ELK的安装、部署并在spring boot环境下使用

一,摘要

ELK在微服务的使用中成了刚需,安装和使用ELK也成了一个程序员必备的技能之一。本文从0开始介绍ELK的安装、部署及使用。里面涉及到笔者踩过的一些坑,希望各位及早规避。

ELK的安装分4个部分,分别是jdk安装、elasticsearch,logstash,kibana。

为了避开一些环境冲突,所以选择了rpm方式安装。

一,环境介绍

1,操作系统

我选用CentOS-7-x86_64-Minimal-2207-02。缺点是预装的少,各工具基本从0安装;优点是避免不必要的一些环境冲突(比如jdk)。

虚拟机安装centos的过程略,建议内存不低于1G,其他没啥建议的。root账号登录就行。

2,JDK

ELK的环境需要JDK支持,我们选择JDK1.8版本。1.8还是大多数java-er钟爱的,不建议太高版本。这里的版本对应查下官方elk对应的jdk版本。简单点说,ELK7及以下的,都建议用jdk1.8版本。ELK8开始就需要升级了。

3,ELK版本

刚才说了,我们打算用ELK7及以下的,目前ELK7的最高版本是7.17,然后就是8.x了。本文我们选择66大顺版本,打算elasticsearch,logstash,kibana这3个版本号都选用6.6.0(建议3个版本保持一致,尤其是大版本,就是不建议es是6,logstash是5)

4,OS安装后的前序准备

在开始安装ELK之前,先检查虚拟机的网络

ip addr

再检查时间,

timedatectl

并设置时间同步,必要时修改时区为上海。

yum install ntp
systemctl enable ntpd
systemctl start ntpd

也可以选择性的安装一些工具,比如vim

yum install vim

不多说了,反正缺啥补啥,yum直接装。

二,JDK安装

先看看本机安装jdk没有

java -version

有的话先卸载,

rpm -qa|grep jdk
rpm -e --nodeps jdk1.8.xxxxxx.x86_64

没有的话我们就开始装了。建议用rpm的方式安装,会帮我们省下好多可能发生的环境问题。我们安装到/usr/java路径下,注意这个路径,将来要配置它的,所以要记得它。

sudo rpm -ivh --prefix=/usr/java jdk-8u381-linux-x64.rpm

安装好后,还是要添加一些环境变量的

vi /etc/profile

在末尾换行添加JAVA的环境变量,路径要是真实的jdk安装路径,先去核实一下在不在,别乌龙。

JAVA_HOME=/usr/java/jdk-1.8-oracle-x64
CLASSPATH=.:%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME

然后重载profile,让新的java变量生效。

source /etc/profile

然后再java -vsersion就能看到jdk生效了

[root@localhost ~]# java -version
java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)

三,Elasticsearch安装和部署

wget装起来

yum install wget

 下载

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm

安装巴拉巴拉

rpm -ivh elasticsearch-6.6.0.rpm

安装好其实就可以启动了,但是我们还要关注下es的配置文件

vim /etc/elasticsearch/elasticsearch.yml

里面大部分我觉得是不需要改的,比如数据文件路径,日志文件路径,端口9200等,若不需要的话可以不改。主要是一个访问对象的ip地址是不是需要拦截需要关注下,也就是logstash等。我的logstash是和es安装在同一台机器上,不存在拦截,所以也不需要改,全程默认参数即可。

#network.host: 192.168.0.1
#http.port: 9200
#不需要改的话,这个#号都不需要删除,默认的就是192.168.0.1:9200

启动es

# 启动
systemctl start elasticsearch
# 查看状态
systemctl status elasticsearch
# 设置开机启动
systemctl enable elasticsearch

验证es安装成功

curl http://127.0.0.1:9200

显示如下即成功啦

[root@localhost ~]# curl http://127.0.0.1:9200
{
  "name" : "sJGRgq0",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hPfC9i-zTOuIaJMXlnHKgQ",
  "version" : {
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

如果安装过程发生一些意外,需要卸载重装的话,那么卸载方式是:

# 检查elasticsearch服务状态
systemctl status elasticsearch
# 停止elasticsearch服务状态
systemctl stop elasticsearch
# 剔除elasticsearch服务
systemctl disable elasticsearch
# 重载系统服务
systemctl daemon-reload
# 查询rpm安装的elasticsearch,若有会显示文件名,该文件名下一步会用
rpm -qa | grep elasticsearch
# rpm卸载elasticsearch
rpm -e --nodeps elasticsearch-7.17.7-1.x86_64
# 删除残留文件
rm -rf /etc/elasticsearch
# 删除elasticsearch自定义文件
rm -rf /opt/software/elasticsearch

如果换了ip不在本机甚至不在本局域网环境的,需要修改es的yml文件中network.host参数,比如面向所有ip开放就是network.host:0.0.0.0,并开放防火墙的9200端口。如果ELK装在一台机器上,可以不对外开放。

#防火墙打开和重载
firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --reload

# 安装net-tools 
yum install -y net-tools
# 检查9200是否有监听
netstat -antp |grep 9200

[root@localhost ~]# netstat -antp |grep 9200
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      35601/java
tcp6       0      0 ::1:9200                :::*                    LISTEN      35601/java

四,Logstash安装和部署

和ES的安装类似,先下载:

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.rpm

安装巴拉巴拉

rpm -ivh logstash-6.6.0.rpm

注意了,如果你安装的是7以上版本的logstash,安装好后,关注下提示语的第一行,这里的using JAVA_HOME defined java的路径是不是你之前jdk的路径,如果不是,还需要强制去修改logstash的JDK路径的。需要在配置时,添加一个LS_JAVA_HOME的参数,指定到JAVA_HOME即可。不过logstash8开始明确不支持jdk1.8了,需要升级jdk或降低logstash的版本。下图所示的就是说7.17.7的logstash他不愿意使用jdk1.8,而采用了自带的openjdk。

[root@localhost ~]# rpm -ivh logstash-7.17.7-x86_64.rpm
警告:logstash-7.17.7-x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:logstash-1:7.17.7-1              ################################# [100%]
Using JAVA_HOME defined java: /usr/local/java/jdk1.8.0_371
WARNING: Using JAVA_HOME while Logstash distribution comes with a bundled JDK.
DEPRECATION: The use of JAVA_HOME is now deprecated and will be removed starting from 8.0. Please configure LS_JAVA_HOME instead.
Using provided startup.options file: /etc/logstash/startup.options
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.32/lib/pleaserun/platform/base.rb:112: warning: constant ::Fixnum is deprecated
Successfully created system startup script for Logstash

那我们回到主题,来启动logstash

# 启动
systemctl start logstash
# 查看状态
systemctl status logstash
# 设置开机启动
systemctl enable logstash

启动后,通过查看状态,我们发现logstash启动是能启动,但是pid一直在更换。为什么?因为他一直在重启。为什么重启可以看下错误日志,一般是jdk环境和配置文件正确。一般logstash在7以下只要配置了JAVA_HOME等参数,就不怎么会出现jdk的环境问题。

检查配置文件

logstash.yml文件基本不用动,数据和日志的存放路径就默认的好了。高版本的可能要改下yml文件里的

pipeline.ecs_compatibility: <desired_mode>
#明确设置 pipeline.ecs_compatibility 的值。你可以选择以下ECS兼容模式:  
#-  disabled :这个模式禁用ECS兼容性,使用Logstash的默认行为。 
#-  v1 :这个模式启用ECS兼容性,并使用ECS规范的版本1。 

低版本的可以修改下logstash.yml文件中的path.config,本文的6.6及以上7,8的版本,该参数在pipelines.yml文件下。

path.config: "/etc/logstash/conf.d/logstash.conf"

可以关注在/etc/logstash/路径下的这些文件。

[root@localhost ~]# ls /etc/logstash
conf.d       log4j2.properties     logstash.yml   startup.options
jvm.options  logstash-sample.conf  pipelines.yml

还有一些更敏感的配置文件在logstash的安装目录下,也就是 /usr/share/logstash/bin/

[root@localhost ~]# ls  /usr/share/logstash/
bin           data     Gemfile.lock  LICENSE.txt    logstash-core-plugin-api  NOTICE.TXT  vendor
CONTRIBUTORS  Gemfile  lib           logstash-core  modules                   tools       x-pack
[root@localhost ~]# ls  /usr/share/logstash/bin
benchmark.sh         logstash               logstash.lib.sh      pqrepair
cpdump               logstash.bat           logstash-plugin      ruby
dependencies-report  logstash-keystore      logstash-plugin.bat  setup.bat
ingest-convert.sh    logstash-keystore.bat  pqcheck              system-install

在配置文件中,最重要的是conf文件,在有些版本中,把/etc/logstash/目录下的logstash-sample.conf,拷贝进conf.d文件夹内即可。也可以在conf文件夹下单独新建个:

vim /etc/logstash/conf.d/logstash.conf
input{
    tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 9600
        codec => json_lines
    }
}
output{
    stdout{
       codec => rubydebug
    }
    elasticsearch {
       hosts => ["127.0.0.1:9200"]
    }
}

然后我们开放下9600的端口,

firewall-cmd --add-port=9600/tcp --permanent
firewall-cmd --reload

关于conf文件有2个坑,1个坑是他里面配置的host和port不能与yml文件里的host和port同时配置,否则会造成冲突,表象是logstash反复重启。我是yml文件里不配置,只在conf文件的input里来配置。

另外一个坑是这个conf的内容写入,不能vim创建文件后,借助ssh的鼠标拷贝进去。这会有可能丢失“input”里面的“i”,而变成“nput”,实在要偷懒拷贝的话,可以在ssh里面的资源管理器里,用记事本打开编辑,拷贝,保存。注意格式得是utf-8的。

好了,既然conf文件也配置好了,我们重启logstash,让新conf生效。

systemctl restart logstash

我们发现logstash的pid稳定了,不重启了。

再输入以下测试命令,看看logstash是否正常工作了没?

 /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["127.0.0.1:9200"] } stdout { codec => rubydebug }}'

输入命令后,紧跟着随便输入一段日志内容:test log

如果输出以下json代表正常

test log
{
      "@version" => "1",
       "message" => "test log",
    "@timestamp" => 2023-08-22T06:24:00.602Z,
          "host" => "localhost.localdomain"
}

当然,在输入这段json之前,可能还会报一些WARN和INFO,关于警告部分,可以忽略,因为我们这条测试命令没有指定具体的配置文件。不要紧,只要不是ERRO都不影响的。

五,Kibana的安装和部署

下载,安装巴拉巴拉

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.0-x86_64.rpm
rpm -ivh kibana-6.6.0-x86_64.rpm

修改配置文件

vim /etc/kibana/kibana.yml

前面的ES和LS的端口和IP可以不设置是因为基本上是本机访问,而kibana需要对C端开放访问了,所以安全策略上还是要提高下。

# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601
#这里的端口要在防火墙上策略关照下,不建议公网所有人访问该端口
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "0.0.0.0"
#这里的允许访问kibana的对象host,建议指定具体的IP或IP段访问

然后我们启动

# 启动 
systemctl start kibana
# 查看状态
systemctl status kibana
# 设置开机启动 
systemctl enable kibana

打开防火墙

[root@localhost ~]# firewall-cmd --add-port=5601/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success

此时,我们访问kibana的地址http://192.168.226.150:5601/,终于看到效果了。

 先在Management里面创建好索引,就可以看回到Discover看到之前测试进去的日志啦。前面忙活了这么久,到这里是不是有些欣慰呢?

不急,因为kibana是2C的,除了在防火墙和路由层面进行ip和端口的限制之外,还建议给kibana设置一道登录密码。但是这里不做介绍了,有兴趣的可以去研究下。其实ES提供了强大的账号安全机制。

六,Spring boot应用ELK的demo

首先我们创建一个spring boot的web应用程序,然后执行以下步骤

1,脚手架部分的pom如下:

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

这里注意版本号,有时候连接成功但是无日志有可能是这里的版本不对原因,可以换个5.3或其他版本试试。

2,新建src/main/resources/logback-spring.xml文件,

内容简单点可以如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <property name="LOGSTASH_HOST" value="${LOGSTASH_HOST:-${DOCKER_HOST:-192.168.226.150}}" />
    <property name="LOGSTASH_PORT" value="${LOGSTASH_PORT:-9600}" />

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${LOGSTASH_HOST}:${LOGSTASH_PORT}</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>
    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

 3,application.properties文件中增加:

# Logstash appender 配置
logging.config=classpath:logback-spring.xml

4,Controller文件里写日志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Controller
public class BasicController {
    private static final Logger logger = LoggerFactory.getLogger(BasicController.class);
    // http://127.0.0.1:8080/hello?name=elk
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
        logger.info("这是一条关于hello elk的日志消息");
        return "Hello " + name;
    }

运行后,可以看到日志写入的效果啦

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laolitou_1024

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值