Linux云计算 |【第五阶段】ARCHITECTURE-DAY2

发布于:2024-10-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

主要内容:

搭建Logstash完成ELK集群、实现Web日志实时分析

一、Logstash介绍

Logstash 是一个开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,并将数据发送到你指定的存储库中。它通常与 Elasticsearch 和 Kibana 一起使用,构成 ELK 技术栈,用于日志分析、数据收集和处理等场景。

特点:

  • ① 所有类型的数据集中处理;
  • ② 不同模式和格式数据的正常化;
  • ③ 自定义日志格式的迅速扩展;
  • ④ 为自定义数据源轻松添加插件;

主要功能:

1)数据采集:

输入插件:Logstash 支持多种输入插件,可以从文件、数据库、消息队列、日志文件、网络端口等多种来源采集数据。
示例:
- file 插件:从文件中读取数据。
- beats 插件:从 Beats 代理(如 Filebeat、Metricbeat)接收数据。
- syslog 插件:从 Syslog 服务器接收日志数据。

2)数据转换:

过滤器插件:Logstash 提供了丰富的过滤器插件,用于解析、转换和丰富数据。
示例:
- grok 插件:解析非结构化数据,将其转换为结构化数据。
- mutate 插件:对字段进行重命名、删除、替换等操作。
 -date 插件:解析日期字段,并将其设置为事件的时间戳。

3)数据输出:

输出插件:Logstash 支持多种输出插件,可以将处理后的数据发送到 Elasticsearch、文件、数据库、消息队列等多种目标。
示例:
- elasticsearch 插件:将数据发送到 Elasticsearch 进行存储和分析。
- file 插件:将数据写入文件。
- stdout 插件:将数据输出到标准输出,通常用于调试。

1、Logstach的工作结构

Logstash 的配置文件通常由三个主要部分组成:input、filter 和 output。

input {
  # 输入插件配置
}

filter {
  # 过滤器插件配置
}

output {
  # 输出插件配置
}

简单的 Logstash 配置示例:

从文件中读取日志数据,解析日志,并将解析后的数据发送到 Elasticsearch

input {
  file {
    path => "/var/log/myapp.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
  }
  date {
    match => [ "timestamp", "ISO8601" ]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "myapp-logs-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

 

2、Logstash的数据类型

数据类型

示例

布尔值类型

ssl_enable => true

字节类型

bytes => “1MiB”

字符串类型

name => “xkops”

数值类型

prot => 22

数组

match => [“datetime”,”UNIX”]

哈希(键值对)

options => { k => “v”, k2 => “v2”}

注释

#

 

3、Logstash的语法

语法

说明

==

等于

!=

不等于

小于

大于

小于等于

>=

大于等于

=~

匹配正则

!~

不匹配正则

in

包含

not in

不包含

and

or

nand

非与

xor

非或

4、ELK架构图例:

  • 日志收集和分析:从多个来源收集日志数据,解析和转换数据,并将数据发送到 Elasticsearch 进行存储和分析。
  • 数据清洗和转换:对原始数据进行清洗、转换和丰富,使其更适合后续分析和存储。
  • 实时数据处理:实时处理和分析数据,支持实时监控和报警。

部署logstash示例:

① 配置主机名解析文件(包括所有ES节点和本机的主机名)

② Logstash依赖JAVA环境,所以安装java-openjdk、Logstash软件包

③ Logstash没有默认配置文件,需手动配置

1)配置文件管理

  • - 默认安装目录:/usr/share/logstash
  • - 配置文件路径:/etc/logstash

注意:因为Logstash默认会在安装目录下寻找配置文件,所以需要将配置文件通过软连接关联到安装目录的路径下:# ln -s /etc/logstash /usr/share/logstash/config

  • - 配置文件格式:(input、filter、output区域)

步骤1:安装logstash

① 购买1台云主机

主机名称

IP地址

相关配置

logstash

192.168.1.47

最低配置2核4G

② 配置主机名解析

[root@logstash ~]# vim /etc/hosts
192.168.1.41   es-0001
192.168.1.42   es-0002
192.168.1.43   es-0003
192.168.1.44   es-0004
192.168.1.45   es-0005
192.168.1.47   logstash

③ 安装JAVA环境,及Logstash软件包

[root@logstash ~]# yum install -y java-1.8.0-openjdk logstash

④ 将配置文件/etc/logstash/作为源路径,软链接方式到/usr/share/logstash/config

[root@logstash ~]# ls /etc/logstash/

[root@logstash ~]# ln -s /etc/logstash/ /usr/share/logstash/config
[root@logstash ~]# ls /usr/share/logstash/

[root@logstash ~]# ls /usr/share/logstash/config/

⑤ 修改配置文件(手动配置)

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {        //日志数据输入区域
  stdin{}      //stdin标准输入插件
}

filter{ }       //数据过滤规则处理区域

output{         //日志数据输出区域
  stdout{}      //stdin标准输出插件
}

⑥ 启动Logstash验证,测试效果

[root@logstash ~]# /usr/share/logstash/bin/logstash

补充:任意输入字符进行测试,返回的是JSON格式的信息;

2)插件管理

上面的配置文件使用了 Logstash-input-stdinLogstash-output-stdout 两个插件,Logstash对数据的处理依赖插件;

  • - 管理命令: /usr/share/logstash/bin/logstash-plugin

① 安装插件install

② 删除插件uninstall

③ 查看插件list

例如:

[root@logstash ~]# ls /usr/share/logstash/bin/

[root@logstash ~]# /usr/share/logstash/bin/logstash-plugin    //执行管理命令

[root@logstash ~]# /usr/share/logstash/bin/logstash-plugin list   //查看插件
logstash-codec-json      //logstash-codec-xxx编码格式插件
logstash-filter-dns      //logstash-filter-xxx只能用于filter段的插件
logstash-input-stdin     //logstash-input-xxx只能用于input段的插件
logstash-output-stdout   //logstash-output-xxx只能用于output段的插件
…

插件名用【-】分隔,logstash表示为Logstash的插件,插件使用区域,插件名;其中codec字符编码可以适用于所有区域。

步骤2:插件与调试格式

① 编写配置文件,使用json格式字符串测试: {"a":"1", "b":"2", "c":"3"}

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  stdin{ codec => "json" }      //标准输入,采用json编码格式输入
}
 
filter{ }
 
output{
  stdout{ codec => "rubydebug" }   //标准输出,采用rubydebug编码格式,可展现完整的数据格式(便于调试)
}

② 启动Logstash验证,测试效果

[root@logstash ~]# /usr/share/logstash/bin/logstash

在写配置文件时,标准输入区域的格式取决于数据源,一般标准输出区域的格式默认是rubydebug格式,便于阅读和调试;

二、插件的帮助手册

Logstash里面插件众多,不同的插件参数也不同,需要学会通过手册查找所需插件;

官方手册地址:Logstash Reference [8.15] | Elastic

1、input插件 配置管理

  • - file插件,主要用途是从本地文件中获取数据,并实时监控文件的变化;
  • - 核心参数:

① path要监控的文件路径

path => [“/tmp/a.log”,”/tmp/b.log”]

② start_position第一次读取文件位置[beginning|end]

start_position => “beginning”

③ sincedb_path记录读取文件的位置(类似书签)

sincedb_path => “/var/lib/logstash/sincedb-access”

④ type提供一个字符串标记

type => “testlog”

例如:

 

例如1:Logstash从本地文件中获取数据

# 查询插件的帮助手册,找到Input plugins中的file插件;

# 在file插件中找到该格式的模板

# 在file插件中找到Option,在Required选项中找到YES为必须配置(array为数组)

# 在array中,找到文件路径的Example;

# 修改配置文件①

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  stdin{ codec => "json" }
  file{         //使用file模块
    path => ["/tmp/a.log","/tmp/b.log"]     //从本地文件中获取数据
  }
}

filter{ }

output{
  stdout{ codec => "rubydebug" }
}

[root@logstash ~]# /usr/share/logstash/bin/logstash   //启用Logstash

# 打开另一个终端测试

[root@logstash ~]# cd /tmp/
[root@logstash tmp]# echo "TEST_${RANDOM}" >> a.log
[root@logstash tmp]# echo "TEST_${RANDOM}" >> b.log

# 启动Logstash验证,测试效果

# 修改配置文件②

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  stdin{ codec => "json" }
  file{
    path => ["/tmp/a.log"]
    type => "is apache"    //字符串标签,用来区分不同数据种类的手段
  }
  file{
    path => ["/tmp/b.log"]
    type => "is nginx"
  }
}

filter{ }

output{
  stdout{ codec => "rubydebug" }
}     
    
[root@logstash ~]# /usr/share/logstash/bin/logstash   //启用Logstash

# 打开另一个终端测试

[root@logstash tmp]# echo "TEST_${RANDOM}" >> a.log
[root@logstash tmp]# echo "TEST_${RANDOM}" >> b.log

# 启动Logstash验证,测试效果

补充:Logstash默认会创建书签文件,用来记录上一次读取数据文件的位置,默认存放在/var/lib/logstash/plugins/inputs/file/下;每次对Logstash重启,就会生成书签文件;需要指定书签文件,便于管理;

 


示例:input file插件

① 修改配置文件

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  file {
    path => ["/tmp/c.log"]       //要监控的文件路径
    type => "test"        //字符串标签,用来区分不同数据种类的手段
    start_position => "beginning"   //第一次读取文件位置[beginning|end]
    sincedb_path => "/var/lib/logstash/sincedb"   //记录读取文件的位置
  }
}

filter{ }

output{
  stdout{ codec => "rubydebug" }
}

补充:beginning从开头读取文件

② 删除默认书签文件

[root@logstash ~]# rm -rf /var/lib/logstash/plugins/inputs/file/.sincedb_*

③ 启动Logstash验证,测试效果

[root@logstash ~]# /usr/share/logstash/bin/logstash

2、filter插件配置管理

  • - grok插件,用来解析各种非结构化的日志数据插件;
  • - grok使用正则表达式把非结构化的数据结构化在分组匹配;
  • - 正则表达式需要根据具体数据结构编写(适用性极广)

① 正则表达式分组匹配格式:(自定义)

调用格式:(?正则表达式)

② 正则表达式宏调用格式:(官方宏文件)

调用格式:%{宏名称:名字}

- grok自带宏文件路径:/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns

例如:

补充:为WEB服务器重建ELB负载均衡器,开启获取客户端IP功能

[root@logstash ~]# cat /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/httpd    //查看httpd相关的宏文件


示例:filter grok插件

[root@logstash ~]# echo '192.168.1.252 - - [29/Jul/2020:14:06:57 +0800] "GET /info.html HTTP/1.1" 200 119 "-" "curl/7.29.0"' >/tmp/c.log
[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  file {
    path => ["/tmp/c.log"]       //要监控的文件路径
    type => "test"              //字符串标签
    start_position => "beginning"    //第一次读取文件位置[beginning|end]
    sincedb_path => "/dev/null"     //记录读取文件的位置(devnull),可反复读取测试
  }
}

filter{
  grok {   
    match => { "message" => "%{HTTPD_COMBINEDLOG}" }  //使用宏解析Apahce默认日志格式
  }
}

output{
  stdout{ codec => "rubydebug" }
}

# 启动Logstash,查看效果

[root@logstash ~]# /usr/share/logstash/bin/logstash

3、output插件配置管理

  • - elasticsearch插件是日志分析系统的数据输出插件,主要用途是把filter处理过的json数据写入到elasticsearch集群中;
  • - 核心参数:

① host elasticsearch节点的地址,数组格式:

host => [“es-0004:9200”,”es-0005:9200”]

② index存储数据索引的名称:

index => “weblog”

③ index还支持按日期生成索引,其中YYYY表示年,MM表示月份,dd表示日期:

index => “weblog-%{+YYYY.MM.dd}”

例如:


示例:output elasticsearch插件

① 修改配置文件

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  file {
    path => ["/tmp/c.log"]
    type => "test"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter{
  grok {
    match => { "message" => "%{HTTPD_COMBINEDLOG}" }
  }
}

output{
  stdout{ codec => "rubydebug" }
  elasticsearch {
    hosts => ["es-0004:9200", "es-0005:9200"]    //指定ES集群节点地址
    index => "weblog-%{+YYYY.MM.dd}"     //按日期生成索引(宏)
  }
}

② 启动Logstash,查看效果

[root@logstash ~]# /usr/share/logstash/bin/logstash

③ 通过浏览器访问HEAD页面,连接并查看ES集群elasticsearch插件生成的索引

三、WEB日志实时分析

1、远程获取WEB日志(filebeat服务,ELK、EFK)

由于Logstash依赖JAVA环境,而且占用资源非常大,因此在每一台WEB服务器上部署Logstash非常不合适,为了实现让WEB服务器(或WEB集群)能够将日志数据远程发送给Logstash,可以使用更轻量的filebeat软件收集日志,通过网络给Logstash发送数据,而Logstash使用beats接收日志,完成数据分析;

Logstash接收日志(beats插件)

接收日志必须监听网络服务,Logstash可以通过beats插件接收filebeat发送过来的数据;

例如:

2、filebeat安装配置

  • - 软件包:filebeat
  • - 配置文件路径:/etc/filebeat/filebeat.yml
  • - 修改配置文件


示例:filebeat配置

1)Logstash配置beats插件(服务端)

2)WEB服务器安装filebeat(客户端)

3)启动服务并验证;

- 验证:grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml

- 启动服务: systemctl enable --now filebeat

步骤1:logstash beats插件(Logstash操作)

① 修改配置文件

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  file {
    path => ["/tmp/c.log"]
    type => "test"
    start_position => "beginning"
    sincedb_path => "/var/lib/logstash/sincedb"
  }
  beats {
    port => 5044    //指定监听端口
  }
}
filter{
  grok {
    match => { "message" => "%{HTTPD_COMBINEDLOG}" }
  }
}
output{
  stdout{ codec => "rubydebug" }
  elasticsearch {
    hosts => ["es-0004:9200", "es-0005:9200"]
    index => "weblog-%{+YYYY.MM.dd}"
  }
}

② 启动logstash,查看效果

[root@logstash ~]# /usr/share/logstash/bin/logstash

[root@logstash ~]# ss -nlptu | grep 5044
tcp    LISTEN     0      1024   [::]:5044               [::]:*                   users:(("java",pid=1372,fd=104))

步骤2:web服务安装filebeat(web操作)

① 安装filebeat软件

[root@web ~]# yum install -y filebeat
[root@web ~]# vim /etc/filebeat/filebeat.yml
24:  enabled: true   //打开收集模块
28:  - /var/log/httpd/access_log   //自定义读取日志路径,-为数组,表示可以写多个(支持通配符)
45:    fields:    //自定义标签
46:       my_type: apache    //区分日志的种类
148, 150 注释掉
161: output.logstash:    //设置输出模块
163:   hosts: ["192.168.1.47:5044"]   //指定Logstahsh地址(输出给Logstash)
180, 181, 182 注释掉

② 检查配置并启动服务

[root@web ~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml

[root@web ~]# systemctl enable --now filebeat

③ 访问WEB服务器验证,查看logstash是否新增数据

浏览器访问:http://121.37.211.232/

四、网站日志分析实战

1)目标:

- 实现web日志流量实时分析

- 通过kibana绘制图表展示web访问情况

2)实验步骤:

步骤1:

  • ① 在web服务器上安装filebeat,并把日志发送给Logstash
  • ② Logstash使用beats模块接收日志

步骤2:

  • ① Logstash—input配置beats收集日志
  • ② Logstash—filter对日志格式化
  • ③ Logstash—output写入日志到elasticsearch

步骤3:

  • ① kibana从elasticsearch读取日志图表展示

步骤1:Filebeat配置

① WEB服务器部署Filebeat(负责收集并远程数据给Logstash)

[root@web ~]# yum install -y filebeat    //安装软件
[root@web ~]# vim /etc/filebeat/filebeat.yml     //修改配置文件
24:  enabled: true
28:  - /var/log/httpd/access_log   //-为数组,表示可以写多个(支持通配符)
45:    fields:
46:       my_type: apache    //区分日志的种类
148, 150 注释掉
161: output.logstash:
163:   hosts: ["192.168.1.47:5044"]
180, 181, 182 注释掉

[root@web ~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml   //检查配置文件

[root@web ~]# systemctl enable --now filebeat
[root@logstash ~]# ss -nlptu | grep 5044
tcp    LISTEN     0      1024   [::]:5044       [::]:*        users:(("java",pid=1372,fd=104))

 

步骤2:Logstash配置

- Logstash input配置beats(负责接收Filebeat数据并进行数据分析)

- 通过自定义的fields标签,判断数据来源(采用正则表达式)

[root@logstash ~]# vim /etc/logstash/conf.d/my.conf
input {
  beats {
    port => 5044
  }
}

filter{
  if [fields][my_type] == "apache"{      //判断标签为Apache
  grok {
    match => { "message" => "%{HTTPD_COMBINEDLOG}" }
  }}
}

output{
  stdout{ codec => "rubydebug" }
  if [fields][my_type] == "apache"{
  elasticsearch {
    hosts => ["es-0004:9200", "es-0005:9200"]
    index => "weblog-%{+YYYY.MM.dd}"
  }}
}

[root@logstash ~]# /usr/share/logstash/bin/logstash

步骤3:清空 elasticsearch 中数据

① 删除所有ES集群上面的index索引(库),开始验证(保留kibana运行配置信息的索引)

方法1:HEAD网页-动作(删除)

方法2: curl -XDELETE http://es-0001:9200/*

② 清空所有数据后,测试访问浏览器http://121.37.211.232/

步骤4:配置Kibana(验证)

① 创建索引模式

# 选择timestamp

# 查看索引

# 新建可视化饼图

# 进行数据分片

# 使用另一个客户端,模拟测试访问

[root@ecs-proxy ~]# ab -c 200 -n 200 http://121.37.211.232/

 

小结:

本篇章节为【第五阶段】ARCHITECTURE-DAY2 的学习笔记,这篇笔记可以初步了解到 搭建Logstash完成ELK集群、实现Web日志实时分析。


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。