elk日志收集工具
1、 日志在工作当中的重要性
1、分析日志监控系统运行的状况
2、分析日志帮助开发人员定位bug
3、分析web服务的日志,监控网站访问的情况
4、分析数据库的日志,知道那些查询语句是慢查询语句
。。。。。
2、使用数据库在搜索查询
1、通过全表扫描,用时间很比较长,查询的效率不高
3、日志收集工具有那几种
1、日志易,是一款收费软件
2、splunk国外的一款收费软件
3、elk工具,免费的工具,也有些功能是收费(监控功能,日志审计)
4、elk的简单介绍
1、elk组合的工具elasticsearch 、logstash(日志收集filebeat)、kibana
elasticsearch:是一款数据库软件(非关系型的数据库)
logstaash:收集日志的工具
kibana:对收集后的日志展示的作用
5、elasticsearch的特点及搜索的原理、及应用的场景
1、es特点:
数据的存储、数据的分析、数据的搜索
高性能:水平扩展方便,可以支持一主多从
高可用:把数据分片的方式,分布存储到集群中的每台节点上面(平均)
es功能丰富,配置简单
采用restful风格的接口,可以通过http发起请求
2、es实现的原理
es是在lucene的基础之上,做了二次开发
es采用的是倒排索引
3、应用的场景
电商平台(搜索功能)
高亮显示(github)
日志分析和数据挖掘(elk)
6、如何部署es(elasticsearch)
6.1、es的部署方法
1、tar包的方式:安装后的文件比较集中,便于管理。手写启动脚本
2、rpm包的方式:安装比较简单,安装后的文件路径比较分散
3、docker的方式:下载镜像,通过run命令的方式来启动一个容器
6.2、安装jdk流程
#安装jdk环境
mkdir /opt/es-software
#安装jdk包
rpm -ivh jdk-8u102-linux-x64.rpm
#检查安装jdk信息
java -version
6.3、安装elasticserch包
#进入安装目录(通过清华源下载安装包)
cd /opt/es-software
#安装
rpm -ivh elasticsearch-6.6.0.rpm
#介绍es相关的配置文件信息
/etc/elasticsearch/elasticsearch.yml#es的主要配置文件
/etc/elasticsearch/jvm.options#调整java虚拟机的配置文件
/etc/init.d/elasticsearch#启动的脚本文件
/etc/sysconfig/elasticsearch#配置关于es的相关环境变量
/usr/lib/sysctl.d/elasticsearch.conf#配置关于es的相关系统的变量
/usr/lib/systemd/system/elasticsearch.service
6.4、修改es的主要配置文件
vim /etc/elasticsearch/elasticsearch.yml
[root@es01 es-software]# egrep -v '^$|#' /etc/elasticsearch/elasticsearch.yml
node.name: oldboy01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.240
http.port: 9200
#修改关于java虚拟机的内存配置文件
-Xms512m
-Xmx512m
#启动es服务
systemctl start elasticsearch
6.5、处理报错问题
[2020-03-23T13:23:39,222][ERROR][o.e.b.Bootstrap ] [oldboy01] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
#解决方法,可参考官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/setting-system-settings.html#sysconfig
#添加一个配置文件
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
#重新载入
systemctl deamon-reload
#重新启动es服务
systemctl restart elasticsearch
6.6、确认es服务正常启动
1、curl http://10.0.0.240:9200
7、如何往es数据库写入数据
7.1、熟悉几个概念
1、索引:相当于MySQL的一个数据库
2、类型:相当于一个数据库中的一张表
3、docs:相当于表当中的每行的数据
7.2、通过命令行的方式往es数据库中写入数据
#创建一个索引
curl -XPUT http://10.0.0.240:9200/oldboy?pretty
#往索引里面写入一条数据
curl -XPUT '10.0.0.240:9200/oldboy/student/1?pretty' -H 'Content-Type: application/json' -d'
{
"first_name" : "zhang",
"last_name": "san",
"age" : 28,
"about" : "I love to go rock climbing",
"interests": [ "sports" ]
}'
#写入第二条数据
curl -XPUT '10.0.0.240:9200/oldboy/student/2?pretty' -H 'Content-Type: application/json' -d' {
"first_name": "li",
"last_name" : "si",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}'
#不指定id写入数据
curl -XPOST '10.0.0.240:9200/oldboy/student/?pretty' -H 'Content-Type: application/json' -d' {
"first_name": "li",
"last_name" : "mingming",
"age" : 45,
"about": "I like to swime",
"interests": [ "reading" ]
}'
#使用命令查询数据
curl -XGET '10.0.0.240:9200/oldboy/student/1?pretty'
#查询oldboy索引下面所有的数据
curl -XGET '10.0.0.240:9200/oldboy/_search/?pretty'
#删除一条数据
curl -XDELETE '10.0.0.240:9200/oldboy/student/1?pretty'
#
7.3、使用head插件的方式来和es交互
#添加epel
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装nodejs npm openssl screen
yum install nodejs npm openssl screen -y#配置nodejs环境
node -v
npm -v
#把npm转为cnpm为了使用淘宝源
npm install -g cnpm --registry=https://registry.npm.taobao.org
#克隆head插件的代码
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
cnpm install #版本不对出错了,接着下面搞
yum remove -y nodejs
cd /opt/es-software/
tar xf node-v12.13.0-linux-x64.tar.xz -C /opt
ln -s /opt/node-v12.13.0-linux-x64/ /opt/node
vim /etc/profile
export PATH=/opt/node/bin:$PATH
. /etc/profile
node -v
cd elasticsearch-head/
cnpm install
screen -S es-head
cnpm run start
#使用nodejs的方式来部署head插件有个问题要解决
vim /etc/elasticsearch/elasticsearch.yml(在配置文件的最下方)
http.cors.enabled: true
http.cors.allow-origin: "*"
#重启es服务
systemctl restart elasticsearch
8、使用kibana来和es交互
8.1、安装kibana流程
#上传安装包
cd /opt/es-software
#安装
rpm -ivh kibana-6.6.0-x86_64.rpm
#修改kibana配置文件
vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "10.0.0.240"
elasticsearch.hosts: ["http://10.0.0.240:9200"]
kibana.index: ".kibana"
#启动kibana服务
systemctl start kibana
8.2、在kibana界面通过命令和es交互
#创建索引
PUT oldboy
#写入一条数据
PUT oldboy/student/1
{
"name": "zhang san",
"age": "29",
"xuehao": 1
}
#插入第二条数据
PUT oldboy/student/2
{
"name": "wang wu",
"age": "20",
"xuehao": 2
}
#插入第三条数据
PUT oldboy/student/3
{
"name": "li si",
"age": "24",
"xuehao": 3
}
#插入第四条数据
#使用随机ID
POST oldboy/student/
{
"name": "oldboy",
"age": "19",
"xuehao": 5
}
#在原有数据的基础上更新
POST oldboy/student/2
{
"name": "wang wu",
"age": "30",
"xuehao": 2,
"addr": "beijin"
}
#查询数据
GET oldboy/student/1
GET oldboy/_search
#删除符合条件的数据
POST oldboy/_delete_by_query
{
"query" : {
"match":{
"age":"29"
}
}
}
#删除数据
DELETE oldboy/student/1
#删除指定索引所有的数据
DELETE oldboy
#修改分片的数量
PUT _template/template_http_request_record
{
"index_patterns": ["*"],
"settings": {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
#指定索引修改副本的数量
PUT /oldboy/_settings
{
"number_of_replicas": 2
}
备注:索引一旦被创建,就不能修改分片的数量,但是可以修改副本的数量
9、如何部署es集群(安装方法和单点一样)
9.1、修改es的主配置文件
#修改es01的配置信息
vim /etc/elasticsearch/elasticsearch.yml
[root@es01 es-software]# grep -vE '^$|#' /etc/elasticsearch/elasticsearch.yml
cluster.name: oldboy-cluster
node.name: oldboy01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.240
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.240", "10.0.0.241"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
#修改es02的配置信息
[root@es02 es-software]# egrep -v '^$|#' /etc/elasticsearch/elasticsearch.yml
cluster.name: oldboy-cluster
node.name: oldboy02
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.241
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.241", "10.0.0.242"]
discovery.zen.minimum_master_nodes: 2
#修改es03的配置信息
[root@es03 es-software]# egrep -v '^$|#' /etc/elasticsearch/elasticsearch.yml
cluster.name: oldboy-cluster
node.name: oldboy03
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.242
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.240", "10.0.0.242"]
discovery.zen.minimum_master_nodes: 2
#在每台服务上重启es服务
systemctl restart elasticsearch
9.2、在head界面检查集群是否正常运行
9.4、分片和副本的作用
1、主分片:凡是粗框的都是主分片,响应来至于修改索引数据的请求,响应来至于查询数据的请求
2、副本分片:就是主分片的备份,主要是响应查询数据的请求
3、分片的作用:就是把索引给几块,分布存储到集群当中每台机器上面
9.5、有3台的集群最多可以宕几台机器
1、第一种:
前提是一个副本,然后一台一台的宕机,最多可宕机2台(手动的修改配置文件)
2、第二种
前提还是一个副本,但是同时宕机2台机器,数据也会丢失
3、第三种
前提是有2个副本,最多也是可以宕机2台,并且是同进宕机
9.6、针对集群相关名词介绍
1、分片、副本分片
2、集群健康值
3、主节点和从节点
4、索引
9.7、部署elasticdump工具流程
官网地址:
https://github.com/taskrabbit/elasticsearch-dump
1、安装nodejs环境
cd /opt/es-software
tar xf node-v12.13.0-linux-x64.tar.xz -C /opt
2、做软件链接
ln -s /opt/node-v12.13.0-linux-x64 /opt/node
3、添加环境变量
vim /etc/profile
export PATH=/opt/node/bin:$PATH
4、把加入的环境变量生效
source /etc/profile
5、检查nodejs环境是否生效
node -v
[root@es01 opt]# node -v
v12.13.0
6、把npm转换成cnpm使用淘宝镜像源
npm install -g cnpm --registry=https://registry.npm.taobao.org
7、安装elasticdump工具
cnpm install elasticdump -g
9.8、备份比较重要的索引信息
1、指定索引备份,存储在统一目录下面
mkdir /data
elasticdump \
--input=http://10.0.0.240:9200/oldboy \
--output=/data/oldboy.json \
--type=data
也可把索引备份成为一个压缩文件
2、测试恢复数据
elasticdump \
--input=/data/oldboy.json \
--output=http://10.0.0.240:9200/oldboy
备注:索引一旦创建成功分片的数量无法修改,副本的数量是可以修改的
修改虚拟机的内存的时候,最大不能超32G(可以一次增加8G,也可一次性32G)
9.9、如何监控集群的运行状态
#使用查看当前集群运行的情况
curl '10.0.0.240:9200/_cluster/health?pretty'
{
"cluster_name" : "oldboy-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 15,
"active_shards" : 35,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
#当发现node节点的数量和集群的数量不一致或者集群健康值不是green时,都发报警
10、中文分词器
10.1、中文分词的作用
1、为了让中文相关的词语做合理的划分,
2、把一些人为的不是词语的词当成一个完整的词语,比如‘老男孩’
10.2、如何安装中文分词器(集群中每台服务器都要安装)
#上传中文分词的软件包
cd /opt/es-software
#进入到/usr/share/elasticsearch
./bin/elasticsearch-plugin install file:///opt/es-software/elasticsearch-analysis-ik-6.6.0.zip
#重启es服务
systemctl restart elasticsearch
#在没有应用中文分词模板之前,之前写入的数据没有按中文的要求来划分词语
#应用中文分词器的模板(首先要索引创建)
PUT new
curl -XPOST http://10.0.0.240:9200/new/text/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
#往new索引里面写入几条数据
POST /new/text/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
POST /new/text/2
{"content":"公安部:各地校车将享最高路权"}
POST /new/text/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
POST /new/text/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
#通过查询检查词语是否划分成功
POST /new/_search
{
"query" : { "match" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["", ""],
"post_tags" : [" ", ""],
"fields" : {
"content" : {}
}
}
}
10.3、中文分词器自带的词语无法满足工作需要,如何额外添加自定义的词语
#动态加载扩展的词典依据,当ETag和Last-Modified期中任何一个字段的值发生改变,就会加载扩展词典(F12)
ETag: "5e81b60f-1e"
Last-Modified: Mon, 30 Mar 2020 09:04:15 GMT
1、可以手动修改中文分词自带的词典,加入我们需要的词语,重启es服务
cd /etc/elasitcsearch/analysis-ik
vim main.dic
加入‘老男孩’
2、动态加载扩展的词典
#安装nginx服务
yum install nginx -y
#添加一个虚拟主机
cd /etc/nginx/conf.d
vim www.conf
server {
listen 80;
server_name elk.oldboy.com;
location / {
root /usr/share/nginx/html/download;
charset utf-8,gbk;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
}
#检查nginx是否有语法错误
nginx -t
#创建download目录及扩展词典文件(把扩展的词语添加到dic.txt文件中)
mkdir /usr/share/nginx/html/download
touch /usr/share/nginx/html/download/dic.txt
#启动nginx服务
systemctl start nginx
#本地解析域名(在windows主机上做解析)
C:\Windows\System32\drivers\etc\hosts
10.0.0.240 elk.oldboy.com
#修改中文分词器的配置文件(集群中每台服务都要修改)
cd /etc/elasticsearch/analysis-ik/
vim IKAnalyzer.cfg.xml
http://10.0.0.240/download/dic.txt
#重启es服务
systemctl restart elasticsearch
#在kibana界面通过新添加信息,检查分词是否成功
11、使用filebeat来收集nginx日志
1、查询今天上午10点前访问公司站点,排名前10的ip信息(在5分钟内给我信息)
2、统计一下10点之前访问排名前10的url
3、把昨天上午10点前访问的ip信息和今天10点前访问的ip对比一下,看看有那些异常(分析是否有爬虫的ip)
4、用户访问公司的站点,响应时间有没有超过1s
11.1、部署filebeat软件
#上传filebeat软件包
cd /opt/es-software
#安装filebeat
rpm -ivh filebeat-6.6.0-x86_64.rpm
#修改filebeat的主配置文件
cd /etc/filebeat
mv filebeat.yml filebeat.yml.bak
vim filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
#启动filebeat服务
systemctl start filebeat
ps -ef |grep filebeat
#产生nginx的访问日志
#到head插件界面检查日志是否收集成功
11.2、针对filebeat索引优化
参考官方文档
https://www.elastic.co/guide/en/beats/filebeat/6.6/configuration-template.html
#修改filebeat的主配置文件
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
index: "nginx-access-%{[beat.version]}-%{+yyyy.MM.dd}"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat服务
systemctl restart filebeat
#产生nginx新的访问日志
#head界面检查日志是否收集成功
11.3、把收集上来的日志通过kibana来展示
1、在kibana界面-->management-->index patterns
11.4、使用filebeat收集nginx的json日志
1、修改nginx的日志格式
vim /etc/nginx/nginx/conf
log_format json '{ "time_local": "$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",'
'"upstream_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';
access_log /var/log/nginx/access.log json;
#检查nginx语法
nginx -t
#重启nginx服务
systemctl restart nginx
#把之前的老日志清空
cat /dev/null >/var/log/nginx/access.log
#再产生一些新的访问日志并验证日志是不为json格式
https://www.sojson.com/
#修改filebeat的配置文件(正常情况filebeat无法解析json格式的日志)
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
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
index: "nginx-access-%{[beat.version]}-%{+yyyy.MM.dd}"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat的服务
systemctl restart filebeat
#在head界面检查日志是否正常收集
11.5、在kibana界面展示收集的json格式的日志
12、优化filebeat生成的索引格式
1、优化索引的日期格式
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
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
2、重启filebeat服务
systemctl restart filebeat
3、在head界面验证是否生效,重新生成新的日志
13、filebeat收集多种日志,如何生成不同的索引名称
1、修改filebeat的配置文件
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
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
indices:
- index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/access.log"
- index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/error.log"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
2、重启filebeat服务
systemctl restart filebeat
3、重新生成新的日志,把head界面之前的老索引删除
4、在head界面验证是否生效
5、在kibana界面添加新的index-patterns,展示日志信息
14、使用filebeat收集tomcat的日志
14.1、安装tomcat服务
1、部署tomcat的服务,上传需要安装的软件包
cd /opt/es-software
2、安装jdk和tomcat
rpm -ivh jdk-8u102-linux-x64.rpm
java -version
tar xf apache-tomcat-8.5.49.tar.gz -C /opt
ln -s /opt/apache-tomcat-8.5.49/ /opt/tomcat
3、启动tomcat服务
cd /opt/tomcat/bin
./startup.sh
4、在访问tomcat web界面后,会产生一些日志,但是这些日志不便于分析,需要修改tomcat的日志格式为json(替换原来的pattern)
vim /opt/tomcat/conf/server.xml
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
5、重启tomcat服务
cd /opt/tomcat/bin
./shutdown.sh
./startup.sh
6、把之前的老日志清空
cat /dev/null > /opt/tomcat/logs/localhost_access_log.2020-04-13.txt
cat /opt/tomcat/logs/localhost_access_log.2020-04-13.txt
7、大浏览器页面访问tomcat服务,重新生成新的日志
8、校验日志格式是否为真的json格式
https://www.sojson.com/
14.2、使用filebeat收集tomcat日志
1、修改filebeat的配置文件
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
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
- type: log
enabled: true
paths:
- /opt/tomcat/logs/localhost_access_log.*.txt
json.keys_under_root: true
json.overwrite_keys: true
tags: ["tomcat"]
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
indices:
- index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/access.log"
- index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/error.log"
- index: "tomcat-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "tomcat"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
2、重启filebeat服务
systemctl restart filebeat
3、在head界面验证索引是否生成
4、在kibana界面添加index-patterns,展示日志信息
15、使用filebeat来收集java的日志
15.1、安装java程序
1、上传es安装包,并安装(依赖java环境)
cd /opt/es-software
rpm -ivh elasticsearch-6.6.0.rpm
2、修改es的配置文件,人为的制造一些错误
ttttnode.name: node-1
3、启动es服务
systemctl start elasticsearch
4、发现es已经有报错的日志生成
5、查询官网文档,解决如何收集多行报错的日志信息
https://www.elastic.co/guide/en/beats/filebeat/6.6/multiline-examples.html
15.2、修改filebeat配置文件
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
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
- type: log
enabled: true
paths:
- /opt/tomcat/logs/localhost_access_log.*.txt
json.keys_under_root: true
json.overwrite_keys: true
tags: ["tomcat"]
- type: log
enabled: true
paths:
- /var/log/elasticsearch/elasticsearch.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
tags: ["java"]
output.elasticsearch:
hosts: ["10.0.0.240:9200"]
indices:
- index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/access.log"
- index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/error.log"
- index: "tomcat-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "tomcat"
- index: "java-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "java"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
2、重启filebeat服务
systemctl restart filebeat
3、在head界面验证索引是否生成
4、在kibana界面添加index-patterns,展示收集的日志信息
16、使用filebeat的模块功能收集mysql慢日志
16.1、安装数据库服务
1、安装包文件
yum install mariadb-server -y
2、初始化数据库
mysql_secure_installation
初始化数据库
mysql_secure_installation
输入root用户当前密码
设置root密码:n
移除匿名用户:y
移除test库及相关访问权限:y
禁止root用户远程登陆:y
重新载入权限表:y
3、检查慢日志功能是否开启(首先要登陆mysql服务器)
show variables like '%slow_query_log%';
MariaDB [(none)]> show variables like '%slow_query_log%';
+---------------------+----------------+
| Variable_name | Value |
+---------------------+----------------+
| slow_query_log | OFF |
| slow_query_log_file | web01-slow.log |
+---------------------+----------------+
4、开启慢日志功能,修改mysql配置文件
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
slow_query_log=ON
slow_query_log_file=/var/log/mariadb/slow.log
long_query_time=1
5、保存文件,并重启mysql服务
systemctl restart mariadb
6、人为的产生慢日志
mysqq
select sleep(2) user,host from mysql.user;
16.2、开启mysql模块
1、修改文件名的方式来开启模块
cd /etc/filebeat/modules.d
mv mysql.yml.disabled mysql.yml
2、使用命令方法开启模块
filebeat modules enable mysql
3、查询模块是否开启成功
filebeat modules list
16.3、修改模块配置文件
1、配置mysql模块相关信息
vim /etc/filebeat/modules.d/mysql.yml
- module: mysql
error:
enabled: true
var.paths: ["/var/log/mariadb/mariadb.log"]
slowlog:
enabled: true
var.paths: ["/var/log/mariadb/slow.log"]
16.4、修改filebeat的主配置文件
1、修改filebeat的主配置文件
vim /etc/filebeat/filebeat.yml
output.elasticsearch:
hosts: ["10.0.0.240:9200","10.0.0.241:9200","10.0.0.242:9200"]
indices:
- index: "mariadb-error%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/mariadb/mariadb.log"
- index: "mariadb-slow-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/mariadb/slow.log"
setup.template.name: "mariadb"
setup.template.pattern: "mariadb-*"
setup.template.enabled: false
setup.template.overwrite: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 10s
2、重启filebeat服务
systemctl restart filebeat
3、验证对应的索引信息是否生成
4、在kibana界面添加index-patterns,展示日志信息
17、使用kibana画图分析日志信息
1、上传老日志文件,并解压
cd /opt/es-software
tar xf access.tar.gz
2、添加老日志到nginx的访问日志里
cat /opt/es-software/access.log >> /var/log/nginx/access.log
3、关闭mysql模块功能
filebeat modules disable mysql
4、修改filebeat的配置文件
vim filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
- type: log
enabled: true
paths:
- /opt/tomcat/logs/localhost_access_log.*.txt
json.keys_under_root: true
json.overwrite_keys: true
tags: ["tomcat"]
- type: log
enabled: true
paths:
- /var/log/elasticsearch/elasticsearch.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
tags: ["java"]
output.elasticsearch:
hosts: ["10.0.0.240:9200","10.0.0.241:9200","10.0.0.242:9200"]
indices:
- index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/access.log"
- index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/error.log"
- index: "tomcat-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "tomcat"
- index: "java-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "java"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 10s
5、重启filebeat服务
systemctl restart filebeat
6、在head界面验证日志是否收集成功
7、在kibana界面添加index-patterns,展示日志已经被解析成功
17.1、使用kibana生成一个数据表格图
排名前10的访问ip信息
排名前10的访问的url信息
创建一个饼状图型
创建一个水平bar
创建一个markdown文件类型的图
创建一个dashboard
18、使用filebeat模块功能收集nginx的普通日志
18.1、开通nginx的模块功能
1、使用命令的方式开通
filebeat modules enable nginx
#使用最简单的方式
cd /etc/filebeat/modules.d/
mv nginx.yml.disabled nginx.yml
2、检查是否开启成功
filebeat modules list
18.2、修改nginx模块的配置文件
修改nginx模块的配置文件
vim nginx.yml
- module: nginx
access:
enabled: true
var.paths: ["/var/log/nginx/access.log"]
error:
enabled: true
var.paths: ["/var/log/nginx/error.log"]
18.3、把nginx的日志格式还原成普通的日志格式
1、把之前的老日志清空一下
cat /dev/null > /var/log/nginx/access.log
2、修改nginx的主配置文件(日志格式应用为原来的老模板)
vim /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log main;
3、检查nginx配置文件是否有误
nginx -t
4、重启nginx服务
systemctl restart nginx
5、重新产生一些访问日志
18.4、修改filebeat的主配置文件
vim /etc/filebeat/filebeat.yml
output.elasticsearch:
hosts: ["10.0.0.240:9200","10.0.0.241:9200","10.0.0.242:9200"]
indices:
- index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/access.log"
- index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
source: "/var/log/nginx/error.log"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 10s
#在head界面,清除之前的老索引信息
curl -XDELETE http://10.0.0.240:9200/索引名称
#重启filebeat的服务
systemctl restart filebeat
#发现filebeat无法收集nginx的日志
2020-04-20T12:54:00.848+0800 ERROR pipeline/output.go:100 Failed to connect to backoff(elasticsearch(http://10.0.0.240:9200)): Connection marked as failed because the onConnect callback failed: Error loading pipeline for fileset nginx/access: This module requires the following Elasticsearch plugins: ingest-user-agent, ingest-geoip. You can install them by running the following commands on all the Elasticsearch nodes:
sudo bin/elasticsearch-plugin install ingest-user-agent
sudo bin/elasticsearch-plugin install ingest-geoip
#解决报错问题(如果集群有多台服务器,每台服务器上面都要安装)
上传两个插件的安装包
cd /opt/es-software
#安装这两个插件
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///opt/es-software/ingest-user-agent-6.6.0.zip
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///opt/es-software/ingest-geoip-6.6.0.zip
#重启es的服务
systemctl restart elasticsearch
#在head插件界面检查索引是否生成
#kibana界面添加index-patterns,在discover界面展示收集的日志
19、使用redis做缓存收集日志
架构图
因为es集群处理日志会达到一个峰值,当无法处理时,日志被就会被丢弃,造成分析日志就不精确
19.1、部署redis
1、安装epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2、安装redis
yum install redis -y
3、修改redis的配置文件
vim /etc/redis.conf
bind 10.0.0.240
4、启动redis服务
systemctl start redis
19.2、修改filebeat的配置文件,来收集nginx的json日志
1、把nginx的日志模板应用为json格式
vim /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log json;
2、重启nginx服务
systemctl restart nginx
3、清空nginx之前的老日志
>/var/log/nginx/access.log
4、生成新的访问日志
5、修改filebeat主配置文件
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.redis:
hosts: ["10.0.0.240"]
keys:
- key: "nginx_access"
when.contains:
tags: "access"
- key: "nginx_error"
when.contains:
tags: "error"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
6、重启filebeat服务
systemctl restart filebeat
19.3、在redis服务上验证日志信息是否收到
1、登陆redis服务kkd
redis-cli -h 10.0.0.240
info
keys *
#查看这个键的长度
llen nginx_access
#查看这个键对就有那些值
lrang nginx_access 0 -1
#0代表开头
#-1代表结尾
19.4、部署logstash
1、上传安装包
cd /opt/es-software
2、安装logstash
rpm -ivh logstash-6.6.0.rpm
3、添加一个配置文件
cd /etc/logstash/conf.d
vim redis.conf
input {
redis {
host => "10.0.0.240"
port => "6379"
db => "0"
key => "nginx_access"
data_type => "list"
}
redis {
host => "10.0.0.240"
port => "6379"
db => "0"
key => "nginx_error"
data_type => "list"
}
}
filter {
mutate {
convert => ["upstream_time", "float"]
convert => ["request_time", "float"]
}
}
output {
stdout {}
if "access" in [tags] {
elasticsearch {
hosts => "http://10.0.0.240:9200"
manage_template => false
index => "nginx-access-%{+yyyy.MM}"
}
}
if "error" in [tags] {
elasticsearch {
hosts => "http://10.0.0.240:9200"
manage_template => false
index => "nginx-error-%{+yyyy.MM}"
}
}
}
#先在前台启动测试
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis.conf
#把logstash服务放在后台运行
systemctl start logstash
systemctl enable logstash
#在head界面确认索引是否生成
#在kibana界面添加index-patterns,展示日志
20、使用kafka做缓存收集日志
kafka原理图
1、生产者:产生日志的一方--filebeat
2、消费者:取日志的一方---logstash
3、broker:kafka的一个实例化,每一个kafka服务器都会到zookeeper集群注册,由
zookeeper来选择一个主节点 --kafka
4、topic:存储日志的地方,存储到broker里面
5、分片:是topic的分片,分片的数量可以自定义,并且每一个分片都有一个主分片和从分片
20.1、部署zookeeper
1、上传安装包
cd /opt/es-software
2、安装zookeeper
tar xf zookeeper-3.4.11.tar.gz -C /opt
ln -s /opt/zookeeper-3.4.11/ /opt/zookeeper
3、复制一个配置文件
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
4、创建数据目录
mkdir /data/zookeeper
5、修改zoo.cfg配置文件
vim /opt/zookeeper/conf/zoo.cfg
# 服务器之间或客户端与服务器之间维持心跳的时间间隔
# tickTime以毫秒为单位
tickTime=2000
# 集群中的follower服务器(F)与leader服务器(L)之间的初始连接心跳数
initLimit=10
# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
syncLimit=5
dataDir=/data/zookeeper
# 客户端连接端口
clientPort=2181
# 三个接点配置,格式为: server.服务编号=服务地址、LF通信端口、选举端口
server.1=10.0.0.240:2888:3888
server.2=10.0.0.241:2888:3888
server.3=10.0.0.242:2888:3888
6、在集群当中每台服务器上面都追加一个唯一的id(每台服务器对应的id是不一样)
echo "1" > /data/zookeeper/myid
7、启动zookeeper服务
/opt/zookeeper/bin/zkServer.sh start
/opt/zookeeper/bin/zkServer.sh status
20.2、部署kafka集群
1、上传安装包
cd /opt/es-software
2、安装
tar xf kafka_2.11-1.0.0.tgz -C /opt
ln -s /opt/kafka_2.11-1.0.0/ /opt/kafka
3、创建日志目录
mkdir /opt/kafka/logs -p
4、修改kafka配置文件
vim /opt/kafka/config/server.properties
broker.id=1
listeners=PLAINTEXT://10.0.0.240:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/opt/kafka/logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.0.0.240:2181,10.0.0.241:2181,10.0.0.242:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
5、在前台验证kafka服务能否正常启动
/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
6、创建一个主题
/opt/kafka/bin/kafka-topics.sh --create --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --partitions 3 --replication-factor 3 --topic kafkatest
7、查看一个主题信息
/opt/kafka/bin/kafka-topics.sh --describe --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --topic kafkatest
8、把kafka服务放于后台运行
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
20.3、修改filebeat的配置文件
vim 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.kafka:
hosts: ["10.0.0.240:9092", "10.0.0.241:9092", "10.0.0.242:9092"]
topic: 'filebeat'
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat服务
systemctl restart filebeat
#验证topic是否能生成
/opt/kafka/bin/kafka-topics.sh --describe --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --topic filebeat
Topic:filebeat PartitionCount:1 ReplicationFactor:1 Configs:
Topic: filebeat Partition: 0 Leader: 1 Replicas: 1 Isr: 1
20.4、给logstash添加一个配置文件
cd /etc/logstash/conf.d/
vim kafka.conf
input {
kafka{
bootstrap_servers=>"10.0.0.240:9092"
topics=>["filebeat"]
group_id=>"logstash"
codec => "json"
}
}
filter {
mutate {
convert => ["upstream_time", "float"]
convert => ["request_time", "float"]
}
}
output {
stdout {}
if "access" in [tags] {
elasticsearch {
hosts => "http://10.0.0.240:9200"
manage_template => false
index => "nginx_access-%{+yyyy.MM}"
}
}
if "error" in [tags] {
elasticsearch {
hosts => "http://10.0.0.240:9200"
manage_template => false
index => "nginx_error-%{+yyyy.MM}"
}
}
}
#重启logstash服务
systemctl restart logstash
#在head插件界面,验证索引信息是否生成
#在kibana界面添加index-patterns,展示日志,并且画图