一、ELK简介
1、Elasticsearch

Elasticsearch是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这三个功能的组合

2、Logstash

Logstash是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理。

3、Kibana

kibana是一个开源和免费的工具,它可以为Logstash和ElasticSearch提供的日志分析友好的Web界面,可以帮助您汇总、分析和搜索重要数据日志。

4、ELK版本信息为7.2.1,你可以从官网下,也可以直接从下面地址下载:

https://artifacts.elastic.co/downloads/logstash/logstash-7.2.1.tar.gz
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.1-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-7.2.1-linux-x86_64.tar.gz
官网地址:https://www.elastic.co/cn/downloads/

二、环境准备
1、三台Linux服务器,系统为CentOS7.x
[root@elk-1 config]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core)

2、角色划分

内网服务器信息

NODE

IP

节点类型

node-1

192.168.1.156

数据、主节点(安装elasticsearch、logstash、kabana)

node-2

192.168.1.155

数据节点(安装elasticsearch)

node-3

192.168.1.74

数据节点(安装elasticsearch)

三、 安装Elasticsearch(简称ES)集群

1、下载及解压(省略)
2、创建用户及授权

ElasticSerach要求以非root身份启动,在每个节点创建用户及用户组

-- 创建新用户及授权

# groupadd elsearch
 # useradd elsearch -g elsearch -p elasticsearch
 # cd /data/deploy/elk/
 # chown -R elsearch:elsearch elasticsearch-7.2.1


-- 切换用户,启动

# su elsearch
 # cd elasticsearch-7.2.1/bin
 # sh elasticsearch &


 

3、修改elasticsearch.yml配置文件

3.1、node-1节点配置文件

#三个集群需要同样的集群名
cluster.name: my-application
#每个node的名字需要唯一
node.name: node-1
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#数据存放的位置,需要新建一个目录
path.data: /home/elk/elasticsearch/data
#日志存放的位置,需要新建一个目录
path.logs: /home/elk/elasticsearch/log
#监听的ip
network.host: 0.0.0.0
#监听的端口
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: false
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["192.168.1.155", "192.168.1.156", "192.168.1.74"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

3.2、node-2节点配置文件

#三个集群需要同样的集群名
cluster.name: my-application
#每个node的名字需要唯一
node.name: node-2
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#数据存放的位置,需要新建一个目录
path.data: /home/elk/elasticsearch/data
#日志存放的位置,需要新建一个目录
path.logs: /home/elk/elasticsearch/log
#监听的ip
network.host: 0.0.0.0
#监听的端口
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: false
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["192.168.1.155", "192.168.1.156", "192.168.1.74"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

3.3、node-3节点配置文件

cluster.name: my-application
#每个node的名字需要唯一
node.name: node-3
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#数据存放的位置,需要新建一个目录
path.data: /home/elk/elasticsearch/data
#日志存放的位置,需要新建一个目录
path.logs: /home/elk/elasticsearch/log
#监听的ip
network.host: 0.0.0.0
#监听的端口
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: false
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["192.168.1.155", "192.168.1.156", "192.168.1.74"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

4、启动elasticsearch及关闭

./bin/elasticsearch   #命令窗运行

./bin/elasticsearch  -d  #后台线程运行

ctrl+c                              #命令窗关闭
ps -ef | grep elastic                    #后台线程关闭
kill -9 4442                          #pid 4442为查处线程的pid

5、查看端口号,分别为9200和9300

验证elasticsearch启动,主机名是你的服务器的ip地址或域名

所有机器启动成功

// 输入连接查看(_cat/nodes查看集群所有节点)
http://IP:9200/_cat/nodes

6、elasticsearch启动常见的几个报错

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
切换到root用户,编辑limits.conf添加如下内容

vi /etc/security/limits.conf
 * soft nofile 65536
 * hard nofile 65536

[2]: max number of threads [3818] for user [es] is too low, increase to at least [4096]
最大线程个数太低。修改配置文件etc/security/limits.conf,增加配置
* soft nproc 4096
* hard nproc 4096

[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改/etc/sysctl.conf文件,增加配置vm.max_map_count=262144
vi /etc/sysctl.conf
sysctl -p
执行命令sysctl -p生效

[4]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
问题原因:因为Centos6不支持SecComp,而ES5.2.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动
解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

7、es集群基本操作


#查看集群的健康信息 curl 'localhost:9200/_cluster/health?pretty' #查看集群的详细信息 curl ' localhost:9200/_cluster/state?pretty' #查询索引列表 curl -XGET http:// localhost:9200/_cat/indices?v #创建索引 curl -XPUT http:// localhost:9200/customer?pretty #查询索引 curl -XGET http:// localhost:9200/customer/external/1?pretty #查询es数据 curl -XGET 'http://localhost:9200/_cat/count/索引名称' #删除索引 curl -XDELETE http:// localhost:9200/customer?pretty #删除指定索引 curl -XDELETE localhost:9200/nginx-log-2019.08 #删除多个索引 curl -XDELETE localhost:9200/system-log-2019.0606,system-log-2019.0607 #删除所有索引 curl -XDELETE localhost:9200/_all #在删除数据时,通常不建议使用通配符,误删后果会很严重,所有的index都可能被删除,为了安全起见需要禁止通配符,可以在elasticsearch.yml配置文件中设置禁用_all和*通配符 action.destructive_requires_name: true


四、安装logstash

说明:在每台需要收集日志的服务器部署即可
1、下载解压(省略)

2、修改logstash.yml配置文件(可不修改此配置文件)

http.host: "192.168.1.156"

 

3、创建监控日志的配置文件(重要)

# vim /kibana-761linux-x86_64/config/logstash.conf

input {
tcp {
#模式选择为server
mode => "server"
#ip和端口根据自己情况填写,端口默认4560,对应下文logback.xml里appender中的destination
host => "192.168.1.156"
port => 4560
#格式json
codec => json_lines
}
}
filter {
#过滤器,根据需要填写
}
output {
elasticsearch {
action => "index"
#这里是es的地址,多个es要写成数组的形式
hosts => ["192.168.1.155:9200","192.168.1.156:9200","192.168.1.74:9200"]
#用于kibana过滤,可以填项目名称
index => "%{[appname]}-%{+YYYY.MM.dd}"
}
}
4、启动logstash及关闭
bin/logstash -f /home/logstash-6.3.0/config/logstash.conf     ##命令窗形式
bin/logstash -f /home/logstash-6.3.0/config/logstash.conf &  ##后台线程形式
ctrl+c                                  #命令窗关闭

ps -ef | grep logstash                    #后台线程关闭
kill -9 4617                         ##pid 4617 为查处线程的pid 

验证启动成功
http://IP:9600/

 

五、安装kibana

1、下载及解压(省略)

2、修改kibana配置文件

vi /kibana-761linux-x86_64/config/kibana.yml

server.port: 5601       ##服务端口
server.host: "0.0.0.0"  ##服务器ip  本机

elasticsearch.hosts: ["http://192.168.1.155:9200","http://192.168.1.156:9200","http://192.168.1.74:9200"]

kibana.index: ".kibana"

elasticsearch.requestTimeout: 90000

i18n.locale: "zh-CN"

 

3、启动kibana及关闭
bin/kibana --allow-root      #命令窗启动

nohup bin/kibana --allow-root &     #后台线程启动

ctrl+c                                   #命令窗关闭

ps -ef | grep kibana                    #后台线程关闭
kill -9 4525                          ##pid 4525 为查处线程的pid
验证启动成功
http://IP:5601/



六、kibana简单使用
1、创建索引


可以新建一个全局的索引,【Index pattern】设置为【*】,点击下一步至完成为止。

 

 2、日志搜索

elk filebeat需要部署几台 elk一键部署_ssh

 

如截图所示,可以通过Discover和新建的索引,对日志进行详细的查看,并且可以选择具体的字段进行查看。在右上角,可以通过选择不同的时间段,对日志进行查看和搜索。

 

 

网达环境日志查看:http://192.168.1.156:5601/wd-kibana

咪咕环境日志查看:http://183.192.162.121:473/migu-kibana

 

 

springboot整合elk

pom.xml添加依赖

<dependency>
             <groupId>net.logstash.logback</groupId>
             <artifactId>logstash-logback-encoder</artifactId>
             <version>5.1</version>
 </dependency> 修改logback.xml配置文件
<!-- 输出到logstash的appender -->
 <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
 <!-- logstash的IP和端口,从环境变量注入 ${ELK_DESTINATION}-->
 <destination>127.0.0.1:4560</destination>
 <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
 <customFields>{"appname":"cadip-ability-simulation"}</customFields>
 </encoder>
 </appender> 
     <!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
     <root level="info">
         <appender-ref ref="console"/>
         <appender-ref ref="debug"/>
         <appender-ref ref="error"/>
         <appender-ref ref="logstash"/>
     </root>


 

完整配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
    <springProperty scope="context" name="log_level" source="cadip.log.level" defaultValue="INFO"/>
    <springProperty scope="context" name="log_open_console" source="cadip.log.open_console" defaultValue="false"/>
    <springProperty scope="context" name="app_name" source="spring.application.name"
                    defaultValue="cadip-ability-job"/>
    <springProperty scope="context" name="active" source="spring.profiles.active"/>
    <property name="log_path" value="/tools/logs"/>
    <property name="log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|${PID:-}|%thread|${app_name:-}|%X{X-B3-TraceId:-}|%X{X-B3-SpanId:-}|%X{X-Span-Export:-}|%class.%method-%line|%msg%n"/>
    <!-- Console log output -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- Log file debug output -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_path}/${app_name}/%d{yyyy-MM-dd}.info.log</fileNamePattern>
            <maxHistory>90</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- Log file error output -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_path}/${app_name}/%d{yyyy-MM-dd}.error.log</fileNamePattern>
            <maxHistory>90</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- Feign log -->
    <appender name="feignFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_path}/${app_name}/%d{yyyy-MM-dd}.feign.log</fileNamePattern>
            <maxHistory>90</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 输出到logstash的appender -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- logstash的IP和端口,从环境变量注入 ${ELK_DESTINATION}-->
        <if condition='property("active").contains("preview")'>
            <then>
                <destination>10.150.202.71:4560</destination>
            </then>
            <else>
                <destination>192.168.1.156:4560</destination>
            </else>
        </if>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
            <customFields>{"appname":"${app_name}-${active}"}</customFields>
        </encoder>
    </appender>

    <logger name="feign" level="INFO" addtivity="false">
        <appender-ref ref="feignFile"/>
    </logger>

    <!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
    <root level="${log_level}">
        <if condition='property("log_open_console").contains("true")'>
            <then>
                <appender-ref ref="console"/>
            </then>
        </if>
        <appender-ref ref="file"/>
        <appender-ref ref="error"/>
        <appender-ref ref="logstash"/>
    </root>
</configuration>