ELKF环境搭建

偏头痛杨 2019-06-27

公司需求,要求搭建一套ELK环境,便搜索了一些资料,把整个搭建过程记录下来,以便未来进行翻阅。
ELKF环境搭建

ELKF分别是ElasticSearch,Logstash,Kibana和Filebeat:

  • ElasticSearch大家可以理解为一个搜索引擎
  • Logstash是分析日志过滤日志的工具,也可以收集日志,不过本环境不用
  • Kibana负责前台页面展示
  • Filebeat主要负责日志的收集,相对于Logstash来说,比较轻量化,推荐使用

本次搭建过程,所有软件包用的均是6.2.2版本,大家可以到官网自行下载https://www.elastic.co/cn/,所需软件包如下:
elasticsearch-6.2.4.tar.gz
filebeat-6.2.4-linux-x86_64.tar.gz
kibana-6.2.4-linux-x86_64.tar.gz
logstash-6.2.4.tar.gz
jdk-8u91-linux-x64.tar.gz


一、JDK安装

如果系统环境没有安装JDK的话,需要先安装JDK,如果系统环境已经安装了的话,请跳过本步骤
将压缩包解压到/usr/java/目录下,没有该目录,请自行创建,解压后修改/etc/profile

vim /etc/profile

#在文件末尾添加:
export JAVA_HOME=/usr/java
export JRE_HOME=/usr/java/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=./:$JAVA_HOME/lib:$JRE_HOME/lib

#保存退出后,执行
source /etc/profile

#验证安装结果
java -version

#结果如下,表示安装成功
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

二、ElasticSearch安装

修改文件句柄数量,将max file descriptors调整到至少65536,否则将会报错,报错内容如下:

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

修改,在文件末尾添加:

vim /etc/security/limits.conf

elk soft nofile 819200  
elk hard nofile 819200

修改虚拟内存,将max virtual memory areas vm.max_map_count调整到至少262144,否则将会报错,报错内容如下:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修改,在文件末尾添加:

vim /etc/sysctl.conf

vm.max_map_count=655360

保存退出后执行:

sysctl -p

创建elk用户,本次实验中ELK组建都是在elk用户下进行安装,ElasticSearch不能在root下操作,否则会报错,报错内容如下:

don't run elasticsearch as root

创建用户:

useradd elk -d /home/elk

将所有的软件包都放到elk用户的宿主目录,也就是/home/elk目录下,然后进行安装:
更改软件包权限,并切换到elk用户,将压缩包解压:

chown elk.elk /home/elk/*
su -
tar zxvf elasticsearch-6.2.4.tar.gz

更改配置文件:

cd elasticsearch-6.2.4
vim config/elasticsearch.yml

cluster.name: es_cluster
node.name: node-0
path.data: /home/elk/data
path.logs: /home/elk/logs
network.host: ES机器IP  #这里使用的内网ip
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"

保存退出后,安装X-Pack:

./bin/elasticsearch-plugin install x-pack

运行ElasticSearch:

./bin/elasticsearch -d  #加-d是后台运行,不加是前台运行

手动输入生成密码,生成的elastic、kibana、logstash-system三个用户和密码,记下来备用:

./bin/x-pack/setup-passwords interactive

ELKF环境搭建

三、Kibana安装

解压软件包:

tar zxvf kibana-6.2.4-linux-x86_64.tar.gz

安装Xpack:

cd kibana-6.2.4-linux-x86_64
bin/kibana-plugin install x-pack

修改配置文件:

vim config/kibana.yml

server.port: 5601
server.host: “kibana机器IP”  #这里填写的是内网ip
elasticsearch.url: http://ES机器IP:9200
elasticsearch.username: "kibana"
elasticsearch.password: "kibana password"  #安装ES的X-Pack时生成的密码
kibana.index: “.kibana”

保存退出后启动Kibana:

nohup ./bin/kibana &  #后台启动,直接运行./bin/kibana是前台启动

访问http://kibana机器IP:5601,使用用户elastic及其密码即可登录,这个elastic用户的密码是在安装ES的X-Pack时生成的
ELKF环境搭建

ELKF环境搭建

四、Logstash安装

解压软件包:

tar zxvf logstash-6.2.4.tar.gz

安装Xpack:

cd logstash-6.2.4
./bin/logstash-plugin install x-pack

创建模版:

curl --user elastic:elastic用户密码 -XPUT \
  http://localhost:9200/_template/stephen.logs.template \
  -H 'Content-Type: application/json' \
  -d '{
    "index_patterns": [
        "stephen.logs-*"
    ],
    "settings": {
        "index": {
            "refresh_interval": "5s"
        }
    },
    "mappings": {
        "_default_": {
            "dynamic_templates": [
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false
                        }
                    }
                }
            ],
            "properties": {
                "@timestamp": {
                    "type": "date"
                },
                "@version": {
                    "type": "keyword"
                },
                "geoip": {
                    "dynamic": true,
                    "properties": {
                        "ip": {
                            "type": "ip"
                        },
                        "location": {
                            "type": "geo_point"
                        },
                        "latitude": {
                            "type": "half_float"
                        },
                        "longitude": {
                            "type": "half_float"
                        }
                    }
                }
            }
        }
    },
    "aliases": {}
}'

url中_template后为模板名,可自由指定,body中index_patterns为需要匹配的索引名,可以指定多项,可以使用通配符。本篇中,日志均使用索引stephen.logs-*

为了使logstash可以正常的创建index、上传日志,按照logstash的文档,需要在elastic中创建两组角色用户

curl --user elastic:elastic用户密码 -X POST \
  http://localhost:9200/_xpack/security/role/logstash_writer \
  -H 'Content-Type: application/json' \
  -d '{
  "cluster": ["manage_index_templates", "monitor"],
  "indices": [
    {
      "names": [ "stephen.logs-*" ],
      "privileges": ["write","delete","create_index"]
    }
  ]
}'

生成logstash_internal用户密码,记录下来留作备用:

curl --user elastic:elastic用户密码 -X POST \
  http://localhost:9200/_xpack/security/user/logstash_internal \
  -H 'Content-Type: application/json' \
  -d '{
  "password" : "logstash_internal password",
  "roles" : [ "logstash_writer" ],
  "full_name" : "Internal Logstash User"
}'
curl --user elastic:elastic用户密码 -X POST \
  http://localhost:9200/_xpack/security/role/logstash_reader \
  -H 'Content-Type: application/json' \
  -d '{
  "indices": [
    {
      "names": [ "stephen.logs-*" ],
      "privileges": ["read","view_index_metadata"]
    }
  ]
}'

生成logstash_user的密码,记下来备用:

curl --user elastic:elastic用户密码 -X POST \
  http://localhost:9200/_xpack/security/user/logstash_user \
  -H 'Content-Type: application/json' \
  -d '{
  "password" : "logstash_user password",
  "roles" : [ "logstash_reader", "logstash_admin"],
  "full_name" : "Kibana User for Logstash"
}'

修改配置文件:

vim ./config/logstash.yml

# 打开/关闭monitor功能
xpack.monitoring.enabled: "true" 
# ES地址
xpack.monitoring.elasticsearch.url: "http://ES设定的内网IP:9200"
# logstash_system用户的密码就是安装ES的X-Pack时生成的
xpack.monitoring.elasticsearch.username: "logstash_system"
xpack.monitoring.elasticsearch.password: "logstash system password"

创建并修改配置文件./config/logstash.conf

input {
    beats {
        port => 5044
    }
}


filter {
  if [fields][document_type] == "serverLog" {
    grok {
      patterns_dir => ["./patterns"]
      match => { "message" => "%{TIMESTAMP_ISO8601:time}\s*\[%{THREAD_NAME:thread_name}\]\s+%{LOGLEVEL:level}\s*%{CLASS:class}\s*\-\s*%{TRACE_ID:trace_id}\s*%{CONTENT:content}" }
    }
  }
  if [fields][document_type] == "GsLog" {
    grok {
      patterns_dir => ["./patterns"]
      match => { "message" => "%{LOGLEVEL:level}\s+%{TIMESTAMP_ISO8601:time}\s+\[%{THREAD_NAME:tread_name}\]\s+%{CLASS:class}\s+-\s+%{CONTENT:content}" }
    }
  }
}



output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => ["ES的IP:9200"]
        user => "logstash_internal"
        password => "logstash_internal用户的密码"
        index => "stephen.logs-%{+YYYY.MM.dd}"
        manage_template => false
        template_name => "stephen.logs.template"

    }
}

input为输入模块,此处指定了接收filebeat的端口号
filter为过滤模块,这里我使用的是grok插件
patterns_dir指定的是我自定义pattern文件的位置,用于进行match匹配,grok本身自带了很多patterns,详情请看https://github.com/logstash-p...
如果你想自定义一些正则表达式,建议使用grok debugger进行调试:http://grok.qiexun.net/
这里的match说白了就是正则表达式匹配,例如:

%{TIMESTAMP_ISO8601:time}\s*\[%{THREAD_NAME:thread_name}\]\s+%{LOGLEVEL:level}\s*%{CLASS:class}\s*\-\s*%{TRACE_ID:trace_id}\s*%{CONTENT:content}

#将这一长串代码拆开来看就会直观很多,中间的\s是空格的意思
%{TIMESTAMP_ISO8601:time}
%{THREAD_NAME:thread_name}
%{LOGLEVEL:level}
%{CLASS:class}
%{TRACE_ID:trace_id}
%{CONTENT:content}

#这里,TIMESTAMP_ISO8601相当于一个变量,可以在自定义pattern文件中指定,也可以使用grok自带的
#time是你给前面变量定义的别名,定义好以后会在kibana中看到,不定义的话在kibana中看不到

以下为我自定义pattern grok debugger的调试过程:
ELKF环境搭建

如果想要深入学习的可以参考,建议直接看官方网址的英文原版,所有的插件语法规则都可以在官网上查看:
https://doc.yonyoucloud.com/d...
https://www.elastic.co/guide/...

output为输出模块,这里使用elasticsearch将日志输出到ElasticSearch。这里需要注意的是,index为logstash创建index的规则,这里每天创建一个index,以日期结尾;templat_name为之前创建的模板名

运行以下检测配置文件是否正确:

./bin/logstash -f config/logstash.conf --config.test_and_exit

启动logstash:

#后台运行
nohup bin/logstash -f config/logstash.conf &

#前台运行
./bin/logstash -f config/logstash.conf

五、Filebeat安装

将filebeat-6.2.4-linux-x86_64.tar.gz上传到要收集日志的服务器的/usr/local文件夹下,解压:

cd /usr/local
tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz

配置,主要修改以下几个点:

filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /logs1/1.log
    - /logs2/*.log
  fields:
    document_type: serverLog

- type: log
  enabled: true
  paths:
    - /logs/gs.log
  fields:
    document_type: GsLog
    
output.logstash:
  # The Logstash hosts
  hosts: ["Logstash的ip:5044"]

上面的document_type是为了在logstash中写过滤规则用的,对不同的日志进行不同的过滤

启动filebeat:

#前台启动
./filebeat -e -c filebeat.yml -d "publish"
#后台启动
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &

六、配置Kibana

ELKF环境搭建

ELKF环境搭建

输入后点击 Next step

ELKF环境搭建

选择后点击Create Index pattern,创建好索引后,点击Discover就可以查看日志了!

后期可以根据需求,做nginx反向代理,本次搭建是在阿里云ECS上完成的,没有用阿里云提供的ELK,后续会继续学习ELKF的相关优化,学无止境,愿结伴而行,共勉。

相关推荐