Linux学习elk日志收集工具

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
image.png

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
image.png

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
image.png

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界面检查集群是否正常运行

image.png

9.4、分片和副本的作用

1、主分片:凡是粗框的都是主分片,响应来至于修改索引数据的请求,响应来至于查询数据的请求
2、副本分片:就是主分片的备份,主要是响应查询数据的请求
3、分片的作用:就是把索引给几块,分布存储到集群当中每台机器上面

9.5、有3台的集群最多可以宕几台机器

1、第一种:
   前提是一个副本,然后一台一台的宕机,最多可宕机2台(手动的修改配置文件)
2、第二种
   前提还是一个副本,但是同时宕机2台机器,数据也会丢失
3、第三种
   前提是有2个副本,最多也是可以宕机2台,并且是同进宕机

9.6、针对集群相关名词介绍

1、分片、副本分片
2、集群健康值
3、主节点和从节点
4、索引
image.png

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界面通过新添加信息,检查分词是否成功
image.png

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插件界面检查日志是否收集成功

image.png

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界面检查日志是否收集成功

image.png

11.3、把收集上来的日志通过kibana来展示

1、在kibana界面-->management-->index patterns
image.png
image.png
image.png
image.png

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界面检查日志是否正常收集

image.png

11.5、在kibana界面展示收集的json格式的日志

image.png
image.png
image.png

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界面验证是否生效,重新生成新的日志

image.png

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,展示日志信息
image.png
image.png

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/
image.png

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,展示日志信息
image.png
image.png
image.png

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,展示收集的日志信息
image.png
image.png

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,展示日志信息
image.png
image.png
image.png

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,展示日志已经被解析成功
image.png
image.png

17.1、使用kibana生成一个数据表格图

排名前10的访问ip信息

image.png
image.png
image.png
image.png

排名前10的访问的url信息

image.png
image.png

创建一个饼状图型

image.png
image.png
image.png
image.png
image.png
image.png

创建一个水平bar

image.png

创建一个markdown文件类型的图

image.png
image.png
image.png

创建一个dashboard

image.png
image.png
image.png

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做缓存收集日志

架构图

image.png
因为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,展示日志

image.png

20、使用kafka做缓存收集日志

kafka原理图

image.png
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,展示日志,并且画图
image.png

image.png

你可能感兴趣的:(Linux学习elk日志收集工具)