EFK日志收集

Elasticsearch: 数据库,存储数据,分析,处理  java

logstash: 日志收集,过滤数据        java

kibana:分析,过滤,展示  java

filebeat(采集信息): 收集日志,传输到ES或logstash  go语言

redis 缓冲数据,等待logstash 取数据

filebeat官方文档:

Filebeat | Elastic Documentation

nginx中error日志突增的原因:黑客攻击,伪造大量访问;公司网站不合理,前端网页制作

解决方法:通过zabbix监控来抓包IP地址,防火墙建策略拦截IP地址

实验环境:

基于elk集群基础上

实验步骤

在elk-3上安装kibana

  1. 将软件包拖进虚拟机

  1. 使用rpm命令安装

[root@elk-3 ~]# rpm -ivh kibana-6.6.0-x86_64.rpm

  1. 修改配置文件

[root@elk-3 ~]# vim /etc/kibana/kibana.yml

server.port: 5601   //2行

server.host: "192.168.8.10"  //7行

server.name: "elk-3"   //25行

elasticsearch.hosts: ["http://192.168.8.8:9200"]    //28行

  1. 启动kibana服务

[root@elk-3 ~]# systemctl start kibana

  1. 查看kibana端口号

[root@elk-3 ~]# netstat -anpt |grep 5601

  1. 通过浏览器访问kibana网页

http://192.168.8.10:5601/app/kibana

  1. 在elk-2上安装nginx

拖包

[root@elk-2 ~]# yum -y localinstall *.rpm

  1. 启动nginx服务

[root@elk-2 ~]# systemctl start nginx

  1. 登录8.8的elasticsearch,删除之前创建的索引vipinfo,index1

  1. 在nginx上安装filebeat

将

拖进虚拟机

[root@elk-2 ~]# rpm -ivh filebeat-6.6.0-x86_64.rpm

  1. 修改配置文件

[root@elk-2 ~]# vim /etc/filebeat/filebeat.yml

删除所有并添加

filebeat.inputs:

- type: log

  enabled: true

  paths:    - /var/log/nginx/access.log

output.elasticsearch:   

 hosts: ["192.168.8.8:9200"]

  1. 启动filebeat服务

[root@elk-2 ~]# systemctl start filebeat

  1. 在浏览器访问nginx网页

http://192.168.8.9/

  1. 查看是否有索引filebeat

  1. 在elk-1和elk-3上安装压力测试工具httpd-tools

[root@elk-1 ~]# yum -y install httpd-tools

  1. 在elk-1上进行压力测试

[root@elk-1 ~]# ab -c 1000 -n 10000 http://192.168.8.9/

  1. 在elk-3上进行压力测试

[root@elk-3 ~]# ab -c 200 -n 10000 http://192.168.8.9/

-n requests:用于指定总的请求数。

-c concurrency:用于指定并发请求数。

  1. 在nginx上查看日志

[root@elk-2 ~]# tail /var/log/nginx/access.log

  1. 在浏览器查看filebeat索引数据,发现数据增多

  1. 在kibana添加索引

management——create index

discover——右上角——today

如果没有出现日志信息做以下步骤,点击右上角选择today

  1. 在elk-2上修改nginx的日志格式为json

[root@elk-2 ~]# vim /etc/nginx/nginx.conf

删除红框中的内容,复制粘贴下边的代码

添加在http{}内

log_format log_json '{ "@timestamp": "$time_local", '

'"remote_addr": "$remote_addr", '

'"referer": "$http_referer", '

'"request": "$request", '

'"status": $status, '

'"bytes": $body_bytes_sent, '

'"agent": "$http_user_agent", '

'"x_forwarded": "$http_x_forwarded_for", '

'"up_addr": "$upstream_addr",'

'"up_host": "$upstream_http_host",'

'"up_resp_time": "$upstream_response_time",'

'"request_time": "$request_time"'

' }';

access_log  /var/log/nginx/access.log  log_json;

  1. 重启nginx服务

[root@elk-2 ~]# systemctl restart nginx

  1. 清空日志

[root@elk-2 ~]# >/var/log/nginx/access.log

  1. 查看日志,里边没有内容

[root@elk-2 ~]# cat /var/log/nginx/access.log

  1. 在浏览器访问nginx网站

http://192.168.8.9/

  1. 再次查看日志

[root@elk-2 ~]# cat /var/log/nginx/access.log

  1. 删除filebeat日志,保留kibana

  1. 修改filebeat配置文件

[root@elk-2 ~]# vim /etc/filebeat/filebeat.yml

修改为:

filebeat.inputs:

- type: log

  enabled: true

  paths:

    - /var/log/nginx/access.log

  json.keys_under_root: true  //当处理JSON数据时,如果设置为true,表示将JSON对象的值直接放在根级别

  json.overwrite_keys: true   //如果有重复的值,将覆盖已有的值

output.elasticsearch:

  hosts: ["192.168.8.8:9200"]

  index: "nginx-%{[beat.version]}-%{+yyyy.MM}"  //定义索引名称的设置,使用了logstash的变量替换语法

setup.template.name: "nginx"    //索引模板设置的名称

setup.template.patten: "nginx-*"  //索引模板应用的模式,表示以nginx-*开头的索引都应用这个模板

setup.template.enabled: false    //表示当前索引模板是未启用状态

setup.template.overwrite: true   //如果启用模板,并且存在同名的模板,这个设置将导致已有的模板被覆盖

  1. 重启filebeat服务

[root@elk-2 ~]# systemctl restart filebeat

  1. ab压力测试,生成json日志

elk-1上:

[root@elk-1 ~]# ab -c 1000 -n 1000 http://192.168.8.9/

elk-3上:

[root@elk-3 ~]# ab -c 200 -n 10000 http://192.168.8.9/

查看是否有nginx日志

  1. 配置access.log和error.log分开

在elasticsearch删除之前的日志

  1. 在elk-2上修改filebeat配置文件

[root@elk-2 ~]# vim /etc/filebeat/filebeat.yml

修改:

filebeat.inputs:

- type: log

  enabled: true

  paths:

    - /var/log/nginx/access.log

  json.keys_under_root: true

  json.overwrite_keys: true

  tags: ["access"]

- type: log

  enabled: true

  paths:

    - /var/log/nginx/error.log

  tags: ["error"]

output.elasticsearch:

  hosts: ["192.168.8.8:9200"]

  indices:

    - index: "nginx-access-%{+yyyy.MM}"

      when.contains:

        tags: "access"

    - index: "nginx-error-%{+yyyy.MM}"

      when.contains:

        tags: "error"

setup.template.name: "nginx"

setup.template.patten: "nginx-*"

setup.template.enabled: false

setup.template.overwrite: true

  1. 重启filebeat服务

[root@elk-2 ~]# systemctl restart filebeat

  1. ab压力测试,生成json日志

elk-1上:

[root@elk-1 ~]# ab -c 1000 -n 1000 http://192.168.8.9/

elk-3上:

[root@elk-3 ~]# ab -c 200 -n 10000 http://192.168.8.9/

访问nginx网页时故意输错网址,产生错误日志

  1. 删除之前kibana的索引

  1. 创建新的索引(分别添加成功的和错误的)

  1. kibana图表:

登录--左侧面板选择visualize--点击“+”号--选择图表类型--选择索引--Buckets--x-Axis--Aggregation(选择Terms)--

Field(remote_addr.keyword)--size(5)--点击上方三角标志

在elk-1上,进行压力测试ab -c 1000 -n 1000 http://192.168.8.9/

刷新kibana

  1. kibana监控(x-pack)

登录--左侧面板选择--Monitoring--启用监控

构建filebeat+redis+logstash+es+kibana架构

实验环境:

elk-1.eslasticsearch:192.168.8.8 (elasticsearch)

elk-2.web:192.168.8.9 (elasticsearch、、filebeat、nginx)

elk-3.kibana:192.168.8.10 (elasticsearch、kibana)

redis、logstash:192.168.8.11

EFK日志收集:

Elasticsearch: 数据库,存储数据——java

logstash: 日志收集,过滤数据——java

kibana:分析,过滤,展示——java

filebeat:收集日志,传输到ES或logstash——go

redis:缓冲数据,等待logstash 取数据

filebeat官方文档:

https://www.elastic.co/guide/en/beats/filebeat/current/index.html

filebeat-6.6.0-x86_64.rpm  //从nginx服务日志中读数据并发送redis

redis //负责缓存数据库

logstash-6.6.0.rpm //负责将redis缓存中的数据收集并提交到elasticsearch;是一个数据收集和处理工具

elasticsearch-6.6.0.rpm   //存储 nosql非关系型数据库;分布式搜索和分析引擎以及日志分析与查看

kibana-6.6.0-x86_64.rpm  //展示最后的效果

实验步骤

在第四台上安装redis,并启动服务

  1. 创建安装数据目录

[root@node13 ~]# mkdir -p /data/soft

[root@node13 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}

  1. 进入/data/soft目录,将redis软件包拖进此目录下

[root@node13 ~]# cd /data/soft/

[root@node13 soft]# ls

  1. 解压redis到/opt/redis_cluster,并创建软连接

[root@node13 soft]# tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster

[root@node13 soft]# ln -s /opt/redis_cluster/redis-5.0.7 /opt/redis_cluster/redis

  1. 切换目录安装redis

[root@node13 soft]# cd /opt/redis_cluster/redis

[root@node13 redis]# make && make install

  1. 编写配置文件

[root@node13 redis]# vim /opt/redis_cluster/redis_6379/conf/6379.conf

添加:

bind 127.0.0.1 192.168.8.11

port 6379

daemonize yes

pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid

logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log

databases 16

dbfilename redis.rdb

dir /opt/redis_cluster/redis_6379

  1. 启动当前redis服务

[root@node13 redis]# redis-server /opt/redis_cluster/redis_63

79/conf/6379.conf

  1. 登录redis查看键值

[root@node13 redis]# redis-cli

127.0.0.1:6379> keys *

空的是正确的

  1. elk-2上修改filebeat配置文件,output执行redis

[root@elk-2 ~]# vim /etc/filebeat/filebeat.yml

添加:

filebeat.inputs:

- type: log

  enabled: true

  paths:

    - /var/log/nginx/access.log

  json.keys_under_root: true

  json.overwrite_keys: true

  tags: ["access"]

- type: log

  enabled: true

  paths:

    - /var/log/nginx/error.log

  tags: ["error"]

setup.template.settings:

  index.number_of_shards: 3

setup.kibana:

output.redis:

  hosts: ["192.168.8.11"]

  key: "filebeat"

  db: 0

  timeout: 5

  1. 重启filebeat服务

[root@elk-2 ~]# systemctl restart filebeat

  1. 在elk-1上进行压力测试

[root@elk-1 ~]# ab -c 1000 -n 10000 http://192.168.8.9/

  1. 测试访问网站,登录redis,查看键值

[root@node13 redis]# redis-cli

127.0.0.1:6379> keys *

type filebeat  #filebeat为键值名

LLEN filebeat#查看list长度

LRANGE filebeat 0 -1 #查看list所有内容

  1. 安装logstash(192.168.8.11),收集redis日志,提交给es

[root@node13 redis]# cd /data/soft/

  1. 使用rpm命令安装logstash

[root@node13 soft]# rpm -ivh logstash-6.6.0.rpm

  1. 配置logstash文件,实现access和error日志分离

[root@node13 soft]# vim /etc/logstash/conf.d/redis.conf

添加:

input {

redis {

host => "192.168.8.11"

port => "6379"

db => "0"

key => "filebeat"

data_type => "list"

}

}

filter {

mutate {

convert => ["upstream_time","float"]

convert => ["request_time","float"]

}

}

output {

stdout {}

if "access" in [tags] {

elasticsearch {

hosts => ["http://192.168.8.8:9200"]

index => "nginx_access-%{+YYYY.MM.dd}"

manage_template => false

}

}

if "error" in [tags] {

elasticsearch {

hosts => ["http://192.168.8.8:9200"]

index => "nginx_error-%{+YYYY.MM.dd}"

manage_template => false

}

}

}

  1. 重启logstash服务

[root@node13 soft]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis.conf

  1. 查看elasticsearch

  1. 在elk-1模拟客户端,进行压力测试

[root@elk-1 ~]# ab -c 1000 -n 10000 http://192.168.8.9/

  1. 在elk-4上重新复制一个会话查看键值对

[root@node13 ~]# redis-cli

127.0.0.1:6379> keys *

发现逐渐减少,是因为logstash从redis拿数据,然后发送给elasticsearch

再次查看elasticsearch,收到了数据

  1. 再次查看redis,键值为0

[root@node13 ~]# redis-cli

127.0.0.1:6379> llen filebeat

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐