elk日志分析管理

Elasticsearch: 数据库,存储数据,分析,处理 java
filebeat(采集信息): 收集日志,传输到ES或logstash go语言
Filebeat | Elastic Documentation
nginx中error日志突增的原因:黑客攻击,伪造大量访问;公司网站不合理,前端网页制作
解决方法:通过zabbix监控来抓包IP地址,防火墙建策略拦截IP地址
实验环境:
基于elk集群基础上
![]()
实验步骤
在elk-3上安装kibana
- 将软件包拖进虚拟机


- 使用rpm命令安装
[root@elk-3 ~]# rpm -ivh kibana-6.6.0-x86_64.rpm

- 修改配置文件
[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行




- 启动kibana服务
[root@elk-3 ~]# systemctl start kibana
- 查看kibana端口号
[root@elk-3 ~]# netstat -anpt |grep 5601

- 通过浏览器访问kibana网页
http://192.168.8.10:5601/app/kibana


- 在elk-2上安装nginx
拖包

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

- 启动nginx服务
[root@elk-2 ~]# systemctl start nginx
- 登录8.8的elasticsearch,删除之前创建的索引vipinfo,index1


- 在nginx上安装filebeat
将
![]()
拖进虚拟机
[root@elk-2 ~]# rpm -ivh filebeat-6.6.0-x86_64.rpm

- 修改配置文件
[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"]

- 启动filebeat服务
[root@elk-2 ~]# systemctl start filebeat
- 在浏览器访问nginx网页

- 查看是否有索引filebeat


- 在elk-1和elk-3上安装压力测试工具httpd-tools
[root@elk-1 ~]# yum -y install httpd-tools

- 在elk-1上进行压力测试
[root@elk-1 ~]# ab -c 1000 -n 10000 http://192.168.8.9/

- 在elk-3上进行压力测试
[root@elk-3 ~]# ab -c 200 -n 10000 http://192.168.8.9/
-n requests:用于指定总的请求数。
-c concurrency:用于指定并发请求数。

- 在nginx上查看日志
[root@elk-2 ~]# tail /var/log/nginx/access.log

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

- 在kibana添加索引
management——create index
discover——右上角——today







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

- 在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", '
'"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;

- 重启nginx服务
[root@elk-2 ~]# systemctl restart nginx
- 清空日志
[root@elk-2 ~]# >/var/log/nginx/access.log
- 查看日志,里边没有内容
[root@elk-2 ~]# cat /var/log/nginx/access.log

- 在浏览器访问nginx网站
http://192.168.8.9/

- 再次查看日志
[root@elk-2 ~]# cat /var/log/nginx/access.log

- 删除filebeat日志,保留kibana

- 修改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 //如果启用模板,并且存在同名的模板,这个设置将导致已有的模板被覆盖

- 重启filebeat服务
[root@elk-2 ~]# systemctl restart filebeat
- 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日志

- 配置access.log和error.log分开
在elasticsearch删除之前的日志

- 在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

- 重启filebeat服务
[root@elk-2 ~]# systemctl restart filebeat
- 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网页时故意输错网址,产生错误日志


- 删除之前kibana的索引




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







- 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

- 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,并启动服务
- 创建安装数据目录
[root@node13 ~]# mkdir -p /data/soft
[root@node13 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}
- 进入/data/soft目录,将redis软件包
拖进此目录下
[root@node13 ~]# cd /data/soft/
[root@node13 soft]# ls

- 解压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
- 切换目录安装redis
[root@node13 soft]# cd /opt/redis_cluster/redis
[root@node13 redis]# make && make install
- 编写配置文件
[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

- 启动当前redis服务
[root@node13 redis]# redis-server /opt/redis_cluster/redis_63
79/conf/6379.conf
- 登录redis查看键值
[root@node13 redis]# redis-cli
127.0.0.1:6379> keys *

空的是正确的
- 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

- 重启filebeat服务
[root@elk-2 ~]# systemctl restart filebeat
- 在elk-1上进行压力测试
[root@elk-1 ~]# ab -c 1000 -n 10000 http://192.168.8.9/

- 测试访问网站,登录redis,查看键值
[root@node13 redis]# redis-cli
127.0.0.1:6379> keys *

type filebeat #filebeat为键值名
LRANGE filebeat 0 -1 #查看list所有内容
- 安装logstash(192.168.8.11),收集redis日志,提交给es
[root@node13 redis]# cd /data/soft/


- 使用rpm命令安装logstash
[root@node13 soft]# rpm -ivh logstash-6.6.0.rpm

- 配置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
}
}
}

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

- 查看elasticsearch

- 在elk-1模拟客户端,进行压力测试
[root@elk-1 ~]# ab -c 1000 -n 10000 http://192.168.8.9/

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

[root@node13 ~]# redis-cli
127.0.0.1:6379> keys *

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

- 再次查看redis,键值为0
[root@node13 ~]# redis-cli
127.0.0.1:6379> llen filebeat

更多推荐
所有评论(0)