ELK大数据分析课程

大数据 分析 课程| 2022-09-06

一、概述:

ELK大数据分析课程_filebeats

 

Beats:分布在每个应用服务器的采集器

Beats平台集合了多种单一用途数据采集器,这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。

 

Logstash:接收Beats传过来的数据,分析数据,并发送到存储日志的地方

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。

Elasticsearch:用来存储格式化好的统计数据

Elasticsearch是一个基于Lucene的搜索和数据分析工具,它提供了一个分布式服务。Elasticsearch是遵从Apache开源条款的一款开源产品,是当前主流的企业级搜索引擎。

Kibana:把统计数据通过图表形式展现出来

Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。

二、安装:

2.1 准备工作

* 系统环境:Centos7.4

* 安装必备软件:

yum  install  java-1.8.0-openjdk

* 新建目录:

mkdir /tools
mkdir /tools/install/
mkdir /tools/download/

ELK大数据分析课程

* 新建es用户:

groupadd es              #增加es组
useradd es  -g es -p es  #增加es用户并附加到es组
chown -R es:es /usr/lib/jvm/               #java也需要分配给es用户访问权限
chown -R es:es /tools/   #安装目录分配权限
su es   #切换到es用户

 

2.2 安装Elasticsearch

2.2.1 Elasticsearch下载:

cd /tools/download/
wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.3.tar.gz

2.2.2 解压Elasticsearch程序包:

tar -xzf elasticsearch-6.4.3.tar.gz
mv /tools/download/elasticsearch-6.4.3 /tools/install/elasticsearch-6.4.3
chown -R es:es /tools/install/elasticsearch-6.4.3

2.2.3 Elasticsearch的配置

* 进入elasticsearch-6.4.3目录

  cd /tools/install/elasticsearch-6.4.3

* 设置jvm虚拟内存:

vi config/jvm.options
-Xms512m
-Xms512m

ELK大数据分析课程_kibana_03

* elasticsearch.yml配置:

vi config/elasticsearch.yml

如需远程主机需访问该elasticsearch服务,需配置对外出口ip和端口:

ELK大数据分析课程_大数据_04

指定路径:可以不指定,默认当前路径的data和logs,指定路径后要配置es组的权限

ELK大数据分析课程_ELK_05

配置下载:

* 启动elasticsearch

./bin/elasticsearch -d

* 停止elasticsearch

ps -ef |grep elasticsearch
kill -9 进程id

* 启动配置服务可能会出现的几个错误

1. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

vi /etc/security/limits.conf

加入:

es soft nofile 65536
es hard nofile 65536

ELK大数据分析课程_logstash_06

执行命令:ulimit -Hn

ELK大数据分析课程

2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

ELK大数据分析课程

3.max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]

ELK大数据分析课程

vi /etc/security/limits.d/90-nproc.conf

4. system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

ELK大数据分析课程

bootstrap.system_call_filter: false

2.2.4 启动成功的访问地址

curl 'http://localhost:9200/?pretty'

ELK大数据分析课程_logstash_11

 

2.3 安装Kibana

2.3.1 Kibana下载:

cd /tools/download/
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.3-linux-x86_64.tar.gz

 

2.3.2 解压Kibana程序包:

tar -xzf kibana-6.4.3-linux-x86_64.tar.gz
mv /tools/download/kibana-6.4.3-linux-x86_64 /tools/install/kibana-6.4.3-linux-x86_64
chown -R es:es /tools/install/kibana-6.4.3-linux-x86_64

 

2.3.3 Kibana配置:

* 配置Kibana, 配置server.host地址,需远程连接,因此配置服务器内网IP即可。

vi config/kibana.yml

配置如下:

server.port: 5601
server.host: "172.16.151.119"
elasticsearch.url: "http://localhost:9200"

配置下载:

* 启动kibana

nohup ./bin/kibana &

 

* 访问kibana

访问:http://172.16.151.119:5601
外网:http://外网IP:5601

 

2.4 安装Filebeat

2.4.1 Filebeat下载:

cd /tools/download/
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.3-linux-x86_64.tar.gz

 

2.4.2 解压Filebeat程序包:

tar -xzf filebeat-6.4.3-linux-x86_64.tar.gz
mv /tools/download/filebeat-6.4.3-linux-x86_64 /tools/install/filebeat-6.4.3-linux-x86_64
chown -R es:es /tools/install/filebeat-6.4.3-linux-x86_64

 

2.4.3 配置filebeat.yml文件

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /data/logs/*.log
  fields_under_root: true
  fields:
    alilogtype: applog
#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
#==================== Elasticsearch template setting ==========================
setup.template.settings:
  index.number_of_shards: 3
#----------------------------- Logstash output --------------------------------
output.logstash:
  hosts: ["localhost:5044"]

配置下载:

 

2.4.4 启动filebeat

nohup ./filebeat -c ./filebeat.yml &

 

2.5 安装logstash

2.5.1 logstash下载:

cd /tools/download/
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.3.tar.gz

 

2.5.2 解压logstash程序包:

tar -xzf logstash-6.4.3.tar.gz
mv /tools/download/logstash-6.4.3 /tools/install/logstash-6.4.3
chown -R es:es /tools/install/logstash-6.4.3

 

2.5.3 配置logstash.conf文件

vi config/logstash.conf

配置如下:

input {
  beats {
    port => 5044
  }
}
filter {
        grok {
                patterns_dir => ["/tools/install/logstash-6.4.3/patterns"]
                match => {
                        "message" => "%{IPORHOST:forwordip}.*%{HTTPDATE:logtime}.*"
                }
                remove_field => ["message", "host", "tags", "input", "@timestamp", "offset", "host", "@version", "beat"]
        }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "beat-mylog"
    #user => "elastic"
    #password => "changeme"
  }
  stdout { codec => rubydebug }
}

配置下载:

正则配置:

 

2.5.4 配合jvm.options虚拟内存

-Xms1g
-Xmx1g

 

2.5.5 配置logstash.yml文件

vi config/logstash.yml
node.name: test
pipeline.id: main
pipeline.workers: 2
pipeline.batch.size: 125
pipeline.batch.delay: 50
pipeline.unsafe_shutdown: false
path.config: /tools/install/logstash-6.4.3/config/logstash.conf
http.host: "127.0.0.1"
http.port: 9600-9700

配置下载:

设置

描述

默认值

node.name

节点的描述性名称

机器的主机名

path.data

Logstash及其插件用于任何持久需求的目录

LOGSTASH_HOME/data

pipeline.id

管道的ID

main

pipeline.workers

将并行执行管道的过滤和输出阶段的工人数量,如果你发现事件正在备份,或者CPU没有饱和,请考虑增加这个数字,以更好地利用机器处理能力

主机CPU核心的数量

pipeline.batch.size

在尝试执行过滤器和输出之前,单个工作线程将从输入中收集的最大事件数,更大的批处理大小通常更高效,但代价是增加内存开销,你可能需要增加jvm.options配置文件中的JVM堆空间,有关更多信息,请参阅Logstash配置文件

125

pipeline.batch.delay

当创建管道事件批处理时,在向管道工作人员发送一个较小的批处理之前,等待每个事件的时间为多少毫秒

50

pipeline.unsafe_shutdown

当设置为true时,即使内存中仍然存在游离事件,也会在关闭期间强制Logstash退出,默认情况下,Logstash将拒绝退出,直到所有接收到的事件都被推送到输出,启用此选项可能导致关闭期间的数据丢失

false

path.config

主管道的Logstash配置路径,如果指定目录或通配符,配置文件将按字母顺序从目录中读取

特定于平台的,请参阅Logstash目录布局

config.string

包含要用于主管道的管道配置的字符串,使用与配置文件相同的语法

None

config.test_and_exit

当设置为true时,检查配置是否有效,然后退出,注意,在此设置中没有检查grok模式的正确性,Logstash可以从一个目录中读取多个配置文件,如果你把这个设置和log.level: debug结合起来,Logstash将对合并后的配置文件进行日志记录,并用它来自的源文件注解每个配置块

false

config.reload.automatic

当设置为true时,定期检查配置是否已更改,并在更改配置时重新加载配置,这也可以通过SIGHUP信号手动触发

false

config.reload.interval

Logstash多久检查一次配置文件以查看更改

3s

config.debug

当设置为true时,将完整编译的配置显示为debug日志消息,你还必须设置log.level: debug,警告:日志消息将包含传递给插件配置的任意密码选项,可能会导致明文密码出现在日志中!

false

config.support_escapes

当设置为true时,引号中的字符串将处理以下转义序列:n变成文字换行符(ASCII 10),r变成文字回车(ASCII 13),t变成文字制表符(ASCII 9),\变成字面反斜杠,"变成一个文字双引号,'变成文字引号

false

modules

当配置时,modules必须位于上表中描述的嵌套YAML结构中

None

queue.type

用于事件缓冲的内部队列模型,为基于内存中的遗留队列指定memory,或者persisted基于磁盘的ACKed队列(持久队列

memory

path.queue

启用持久队列时存储数据文件的目录路径(queue.type: persisted)

path.data/queue

queue.page_capacity

启用持久队列时使用的页面数据文件的大小(queue.type: persisted),队列数据由分隔成页面的仅追加的数据文件组成

64mb

queue.max_events

启用持久队列时队列中未读事件的最大数量(queue.type: persisted)

0(无限)

queue.max_bytes

队列的总容量(字节数),确保磁盘驱动器的容量大于这里指定的值,如果queue.max_events和queue.max_bytes都指定,Logstash使用最先达到的任何标准

1024mb(1g)

queue.checkpoint.acks

当启用持久队列时,在强制执行检查点之前的最大ACKed事件数(queue.type: persisted),指定queue.checkpoint.acks: 0设置此值为无限制

1024

queue.checkpoint.writes

启用持久队列时强制执行检查点之前的最大写入事件数(queue.type: persisted),指定queue.checkpoint.writes: 0设置此值为无限制

1024

queue.drain

启用时,Logstash会一直等到持久队列耗尽后才关闭

false

dead_letter_queue.enable

标记指示Logstash以插件支持的DLQ特性

false

dead_letter_queue.max_bytes

每个dead letter队列的最大大小,如果条目将增加dead letter队列的大小,超过此设置,则删除条目

1024mb

path.dead_letter_queue

存储dead letter队列数据文件的目录路径

path.data/dead_letter_queue

http.host

指标REST端点的绑定地址

"127.0.0.1"

http.port

指标REST端点的绑定端口

9600

log.level

日志级别,有效的选项是:fatal、error、warn、info、debug、trace

info

log.format

日志格式,设置为json日志以JSON格式,或plain使用Object#.inspect

plain

path.logs

Logstash将其日志写到的目录

LOGSTASH_HOME/logs

path.plugins

哪里可以找到自定义插件,你可以多次指定此设置以包含多个路径,插件应该在特定的目录层次结构中:PATH/logstash/TYPE/NAME.rb,TYPE是inputs、filters、outputs或codecs,NAME是插件的名称

特定于平台的,请参阅Logstash目录布局

 

2.5.6 logstash启动

nohup ./bin/logstash -f ./config/logstash.conf &

 

参数

说明

举例

-e

立即执行,使用命令行里的配置参数启动实例

./bin/logstash -e "input {stdin {}} output {stdout {}}"

-f

指定启动实例的配置文件

./bin/logstash -f config/test.conf

-t

测试配置文件的正确性

./bin/logstash -f config/test.conf -t

-l

指定日志文件名称

./bin/logstash -f config/test.conf -l logs/test.log

-w

指定filter线程数量,默认线程数是5

./bin/logstash -f config/test.conf -w 8

 

2.5.7 相关地址

input监听:0.0.0.0:5044
Logstash API endpoint:http://127.0.0.1:9600

 

访问:http://127.0.0.1:9600

{"host":"iZbp1f69c0ocoflj7y2nlxZ","version":"6.4.3","http_address":"127.0.0.1:9600","id":"de36d17d-ca9d-4123-a33b-c2b9af00dcd9","name":"test","build_date":"2018-10-31T00:19:35Z","build_sha":"17e7a50dfb0beb05f5338ee5a0e8338e68eb130b","build_snapshot":false}

 

三、格式化日志:

3.1 nginx日志参数配置:

nginx日志输出参数配置:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent $request_body "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" $request_time';

 

nginx日志内容:

* POST:

219.135.135.2 - - [29/Nov/2018:18:41:13 +0800] "POST /portal/users/cartList HTTP/1.1" 302 5 ?appName=luckwine-portal-web&channelCode=01&traceId=1712884f4c9e4d8ad9bdb843824dd197& "http://47.106.219.117:8010/home?a=1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" "-" 0.008

* GET:

219.135.135.2 - - [29/Nov/2018:18:16:32 +0800] "GET /portal/common/needLogin?dd=23 HTTP/1.1" 200 96 - "http://47.106.219.117:8010/home?a=1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" "-" 0.002

 

nginx日志参数:

$args                    #请求中的参数值
$query_string            #同 $args
$arg_NAME                #GET请求中NAME的值
$is_args                 #如果请求中有参数,值为"?",否则为空字符串
$uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #当前请求的文档根目录或别名
$host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname                #主机名
$https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent              #传输给客户端的字节数
$connection              #TCP连接的序列号
$connection_requests     #TCP连接当前的请求数量
$content_length          #"Content-Length" 请求头字段
$content_type            #"Content-Type" 请求头字段
$cookie_name             #cookie名称
$limit_rate              #用于设置响应的速度限制
$msec                    #当前的Unix时间戳
$nginx_version           #nginx版本
$pid                     #工作进程的PID
$pipe                    #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr             #客户端地址
$remote_port             #客户端端口
$remote_user             #用于HTTP基础认证服务的用户名
$request                 #代表客户端的请求地址
$request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file       #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method          #HTTP请求方法,通常为"GET"或"POST"
$request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #请求使用的Web协议,"http" 或 "https"
$server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name             #服务器名
$server_port             #服务器端口
$server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status                  #HTTP响应代码
$time_iso8601            #服务器时间的ISO 8610格式
$time_local              #服务器时间(LOG Format 格式)
$cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent         #用户终端浏览器等信息
$http_x_forwarded_for    #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的http_x_forwarded_for设置
$sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可

 

3.2 Logstash捕获字段:

3.2.1 input组件

input {
  beats {
    port => 5044
  }
}

 

3.2.2 output组件

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "beat-mylog"
    #user => "elastic"
    #password => "changeme"
  }
  stdout { codec => rubydebug }
}

 

3.2.3 filter组件

官方文档:https://www.elastic.co/guide/en/logstash/6.4/filter-plugins.html

完整规格:

filter {
  #正则捕获字段
  grok {}
  #字段类型转换
  mutate {}
  #时间数据赋值到另外字段
  date {}
  #删除数据
  drop {}
}

 

3.2.3.1、Grok匹配日志字段:

a、新建分析nginx日志的配置logstash.conf

filter {
        grok {
                patterns_dir => ["/tools/install/logstash-6.4.3/patterns"]
                match => {
                        "message" => "%{nginx_log}"
                }
                remove_field => ["message"]
        }
        date {
             match => [ "logtime", "dd/MMM/yyyy:HH:mm:ss Z"]
             target => "@timestamp"
        }
}

 

b、捕获方法名 正则表达式

* 规则如下:

nginx_log %{IPORHOST:clientip} - %{USER:user} [%{HTTPDATE:logtime}] "(?:%{WORD:method} %{URIPATH:requestURI}(%{URIPARAM:parms}|)(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:status} %{NUMBER:bytes} (%{URIPARAM:parms}|-) %{QS:referrer} %{QS:agent} "(%{IPORHOST:forwordip}|-)" %{NUMBER:reqtime}

 

grok正则捕获:

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

 

kinbana测试正则捕获是否正确:

ELK大数据分析课程_filebeats_12

 

3.2.3.2、Mutate字段转换

Mutate转化器文档:

https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-convert

https://blog.csdn.net/cromma/article/details/52919742

 

Mutate作用:用于每个输出的字段作后续转换操作

 

convert:

将字段的值转换为另一种类型,如将字符串转换为整数。如果字段值是数组,则将转换所有成员。如果字段是散列,则不采取任何操作

mutate {
    convert => {
      "bytes" => "integer"
      "reqtime" => "float"
    }
}

 

lowercase & uppercase:

大小写转换,数组类型,字段名字作为数据元素。

mutate {
    lowercase => [ "fieldname" ]
}

 

join:数组的分割字符串

使用固定连接符号,连接数组内的元素,如果给定的字段不是数组类型,什么也不做。

mutate {
  split => ["message", "|"]
    }
mutate {
  join => ["message", ","]
}
#join处理前
"message" => “1|2|3|4”

 
#join处理后
"message" => “1,2,3,4”

 

merge:拼接字符串

字符串 + 字符串

数组 + 字符串

操作逻辑:把追加字段的字符拼接到目标字段字符上

mutate {
     merge => { "目标字段" => "追加字段" }
}

 

split: 分割字符为数组

使用分隔符将字段拆分为数组。只对字符串字段有效。

mutate {
     split => { "fieldname" => "," }
}

 

#split处理前
"message" => “1|2|3|4”

 
#split处理后
"message" => [
        [0] "1",
        [1] "2",
        [2] "3",
        [3] "4"
]

 

gsub:替换字符串

数组类型,没有默认设置。

该参数设置只针对string类型,如果不是string类型的,什么也不做。

mutate {
    gsub => [
      "agent", """, "",
      "referrer", """, ""
    ]
}

 

strip:

从字段中删除空白。注意:这只适用于开头和结尾的空格。

mutate {
     strip => ["field1", "field2"]
}

 

3.2.3.3、IP库:

geoip {
            source => "clientip"
            target => "geoip"
}

 

获取到的IP数据:

lat:维度   lon:经度

"geoip" => {
         "country_code3" => "CN",
              "latitude" => 39.9289,
           "region_name" => "Beijing",
              "location" => {
            "lat" => 39.9289,
            "lon" => 116.3883
}

 

3.2.3.4、Drop删除过滤器:

说明:把url中包含图片、css样式、js等文件不要录入日志统计

if ([requestURI] =~ "jpg|png|gif|css|js|ico"){
      drop {}
}

 

3.2.3.5、使用新的配置文件启动:

nohup ./bin/logstash -f ./config/logstash.conf &

 

3.3 kibana界面配置:

界面配置:

https://www.elastic.co/guide/cn/kibana/current/tutorial-visualizing.html