测试环境下ELK+Filebeat部署流程

开发组的同事提的需求,因为每次手动登录服务器查看日志时太慢了效率低,所以申请将要查看的日志接入到elk系统中,这样可以提高工作效率。
因此我这边给自己测试的机器部署了elk系统,给要查看的机器部署了filebeat,通过编写logstash的过滤文件,最终将要查看日志的关键信息显示到了kibana界面。
因为是测试环境使用,所以我还做了kibana的权限认证,新建了role和用户等。
这篇文章只写了操作步骤,涉及到的众多原理稍晚我再总结出来。
下面来看一下具体的部署流程吧~

一、环境规划

两台实验虚拟机搭载centos7.0,ELK服务器是8G内存,Web服务器是16G内存。

因为是测试环境,生产环境中的filebeat搜集到的日志会先传输给kafka然后再传送给logstash

流程:
1.业务请求到达filebeat所在的机器;
2.FileBeat搜集新增的日志,通过LogStash的5044端口上传日志;
3.LogStash将日志信息通过本机的9200端口传入到ElasticSerach;
4.搜索日志的用户通过浏览器访问Kibana,服务器端口是5601;
5.Kibana通过9200端口访问ElasticSerach;

二、环境搭建

前提是本机有java环境,需要提前安装好jdk和tomcat。

java –-version
openjdk 11.0.8 2020-07-14 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.8+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode, sharing)

应用版本统一使用官网下载的7.1.0源码包,解压到对应目录即可(几个软件包必须一致否则会出问题),因为做了kibana的权限验证,所以elk三个的配置文件都有修改xpack部分的内容。

2.1 elk环境搭建

2.1.1 elasticsearch搭建

解压安装包后,新建elasticsearch作为启动elasticsearch的用户,修改解压后目录的权限和配置文件
1.elasticsearch.yml

vim config/elasticsearch.yml
修改下面几行为如下的:
node.name: node-1
network.host: 172.16.108.137
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.initial_master_nodes: ["node-1"]
# 开启权限访问控制
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
  1. jvm.options
vim config/jvm.options
-Xms30g
-Xmx30g

切换到elasticsearch用户,启动服务

su - elasticsearch
cd /usr/local/elasticsearch-7.1.0/bin
nohup ./elasticsearch &

在启动过程中可能会报错,需要对系统的资源限制情况进行修改

  1. elasticsearch每个进程最大同时打开的文件数,至少需要65535;
vim /etc/security/limits.conf
elasticsearch  hard  nofile  65535
elasticsearch  soft  nofile  65535

2.虚拟内存大小

vim /etc/sysctl.conf
vm.max_map_count=262144
sysctl -p

3.elasticsearch修改最大线程个数

vim /etc/security/limits.conf
elasticsearch  hard  nproc   4096
elasticsearch  soft  nproc   4096

这里可以参考:
https://blog.csdn.net/achenyuan/article/details/87881548
https://www.cnblogs.com/hellxz/p/11057234.html

启动成功后,可以在浏览器中访问链接:
http://172.16.108.137:9200/_cat/indices?v

http://172.16.108.137:9200/进行访问

2.1.2 logstash搭建

解压安装包后,修改配置文件下面几行为以下这样,密码为随机生成的8位字符串。

vim /usr/local/logstash-7.1.0/config/logstash.yml
xpack.monitoring.enabled: True
xpack.monitoring.elasticsearch.username: kibana
xpack.monitoring.elasticsearch.password: "********"
xpack.monitoring.elasticsearch.hosts: ["http://172.16.108.137:9200"]
xpack.monitoring.collection.pipeline.details.enabled: true
path.config: /usr/local/logstash-7.1.0/config/*.conf

logstash对日志的过滤文件:

vim /usr/local/logstash-7.1.0/config/app-admin.conf
input {
    beats {
        port => "5044"
    }
}
filter {
    grok {
        match => {
            "message" => "%{GREEDYDATA:timestamp}[%{WORD:log_level}]%{GREEDYDATA:meaasge}"
        }
    }
    date {
        match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
    mutate {
        remove_field => "timestamp"
    }
}
output {
    elasticsearch {
        hosts => ["172.16.108.137:9200"]
        index => "%{[appname]}-%{[loglevel]}-%{+YYYY.MM}"
        user => "elastic"
        password => "********"
    }
}

过滤3个字段:
1.时间 2.日志等级warn/info/error,剩余所有日志信息放在message字段中

生成的es索引格式为:appname(我这里是app-admin/app-activity)-loglevel(日志等级error/info/warn)-时间(年月2020-12)
这几个定义的变量在filebeat子配置文件中有体现。

分为3段:
input为日志输入,这里设定监听端口为5044,获取方式是beat客户端采集。
filter根据日志的log_type进行正则匹配并分割,只处理了以.log结尾的日志。
output为日志输出,这里输出到本机的es进行存储,index按照应用名-loglevel-时间戳存储。

启动logstash:
nohup ./bin/logstash -f config/app-admin.conf &

2.1.3 kibana搭建

解压后新建用户kibana,修改目录所有人所有组为kibana

vim config/kibana.yml
server.port: 5601
server.host: "172.16.108.137"
elasticsearch.hosts: ["http://172.16.108.137:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "********"

修改完成后启动kibana
nohup ./bin/kibana &
三个服务都启动后,对应的端口都会开启。

2.2 filebeat环境搭建

解压后,修改主配置文件filebeat.yml:

filebeat.config.inputs:
  enabled: true
  path: /usr/local/filebeat-7.1.0-linux-x86_64/modules.d/app-*.yml
output.logstash:
  # The Logstash hosts
  hosts: ["172.16.108.137:5044"]

主配置文件中定义了子配置文件的路径,所以就会读取所有子配置文件。

子配置文件:
1.

cat modules.d/app-admin-error.yml
- type: log
  enabled: true
  paths:
    - /data/logs/app-admin/*.log
  fields_under_root: true
  fields: 
    appname: app-admin
    log_type: application
    loglevel: error
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
cat modules.d/app-admin-info.yml          
- type: log
  enabled: true
  paths:
    - /data/logs/app-admin/*.log
  fields_under_root: true
  fields: 
    appname: app-admin
    log_type: application
    loglevel: info
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
 cat modules.d/app-admin-warn.yml     
- type: log
  enabled: true
  paths:
    - /data/logs/app-admin/*.log
  fields_under_root: true
  fields: 
    appname: app-admin
    log_type: application
    loglevel: warn
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
cat modules.d/app-activity-info.yml 
- type: log
  enabled: true
  paths:
    - /data/logs/app-activity/*.log
  fields_under_root: true
  fields: 
    appname: app-activity
    log_type: application
    loglevel: info
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
cat modules.d/app-activity-warn.yml     
- type: log
  enabled: true
  paths:
    - /data/logs/app-activity/*.log
  fields_under_root: true
  fields: 
    appname: app-activity
    log_type: application
    loglevel: warn
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
cat modules.d/app-activity-error.yml         
- type: log
  enabled: true
  paths:
    - /data/logs/app-activity/*.log
  fields_under_root: true
  fields: 
    appname: app-activity
    log_type: application
    loglevel: error
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after

共6个子配置文件

文件最后三行是根据日志文件的具体格式来定的,我这里日志的格式如下:

第一行为正则匹配日期,格式为:4位数字-2位数字-2位数字
第2.3行为将多行写到一个message字段中,不分开。
根据应用配置不同的采集,需要新增field供logstash区分不同应用不同的日志文件和日志格式存入es
java日志需要配置multiline.pattern,配置该正则的行和该行下面所有不匹配的行并入到一条记录上传

启动filebeat:
nohup ./filebeat -e -c filebeat.yml -d publish

2.4 elk开启权限控制

启动kibana的权限控制,为了防止混淆,这里多个用户都是用同一个密码
在elasticsearch目录切换到elasticsearch用户下启动进程:
./bin/elasticsearch-setup-passwords interactive

依次初始化相关用户密码,需要在kibana和logstash等等配置中用到
elastic, kibana, logstash_system, beats_system, apm_system, and remote_monitoring_user
elastic 为superuser

此时,就可以在浏览器中访问kibana:
http://172.16.108.137:5601/app/kibana#/home?_g=()登录了。
登录名:elastic 密码为设置的密码

kibana新建role和普通用户可以参考链接:
https://www.cnblogs.com/sanduzxcvbnm/p/11427692.html

三、使用supervisor进程管理工具管理进程

elk服务器

vim /etc/supervisord.d/elk.conf
[program:elasticsearch]
command=/usr/local/elasticsearch-7.1.0/bin/elasticsearch
directory=/usr/local/elasticsearch-7.1.0
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/elasticsearch.log
redirect_stderr=true
user=elasticsearch

[program:kibana]
command=/usr/local/kibana-7.1.0-linux-x86_64/bin/kibana -c /usr/local/kibana-7.1.0-linux-x86_64/config/kibana.yml
directory=/usr/local/kibana-7.1.0-linux-x86_64
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/kibana.log
redirect_stderr=true
user=root

[program:logstash]
command=/usr/local/logstash-7.1.0/bin/logstash -f /usr/local/logstash-7.1.0/config/app-admin.conf
directory=/usr/local/logstash-7.1.0
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/logstash.log
redirect_stderr=true
user=root

filebeat服务器

vim /etc/supervisord.d/filebeat.conf
[program:filebeat]
command=/usr/local/filebeat-7.1.0-linux-x86_64/filebeat -c /usr/local/filebeat-7.1.0-linux-x86_64/filebeat.yml
directory=/usr/local/filebeat-7.1.0-linux-x86_64
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/filbeat.log
redirect_stderr=true
user=root
原文地址:https://www.cnblogs.com/even160941/p/14234681.html