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

主要内容:

搭建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。

bash 复制代码
input {
  # 输入插件配置
}

filter {
  # 过滤器插件配置
}

output {
  # 输出插件配置
}

简单的 Logstash 配置示例:

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

bash 复制代码
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 |

② 配置主机名解析

bash 复制代码
[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软件包

bash 复制代码
[root@logstash ~]# yum install -y java-1.8.0-openjdk logstash

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

bash 复制代码
[root@logstash ~]# ls /etc/logstash/
bash 复制代码
[root@logstash ~]# ln -s /etc/logstash/ /usr/share/logstash/config
[root@logstash ~]# ls /usr/share/logstash/
bash 复制代码
[root@logstash ~]# ls /usr/share/logstash/config/

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

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

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

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

⑥ 启动Logstash验证,测试效果

bash 复制代码
[root@logstash ~]# /usr/share/logstash/bin/logstash

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

2)插件管理

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

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

① 安装插件install

② 删除插件uninstall

③ 查看插件list

例如:

bash 复制代码
[root@logstash ~]# ls /usr/share/logstash/bin/
bash 复制代码
[root@logstash ~]# /usr/share/logstash/bin/logstash-plugin    //执行管理命令
bash 复制代码
[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"}

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

② 启动Logstash验证,测试效果

bash 复制代码
[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;

# 修改配置文件①

bash 复制代码
[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

打开另一个终端测试

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

启动Logstash验证,测试效果

# 修改配置文件②

bash 复制代码
[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

打开另一个终端测试

bash 复制代码
[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插件

① 修改配置文件

bash 复制代码
[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从开头读取文件

② 删除默认书签文件

bash 复制代码
[root@logstash ~]# rm -rf /var/lib/logstash/plugins/inputs/file/.sincedb_*

③ 启动Logstash验证,测试效果

bash 复制代码
[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功能

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

示例:filter grok插件

bash 复制代码
[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,查看效果

bash 复制代码
[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插件

① 修改配置文件

bash 复制代码
[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,查看效果

bash 复制代码
[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操作)

① 修改配置文件

bash 复制代码
[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,查看效果

bash 复制代码
[root@logstash ~]# /usr/share/logstash/bin/logstash
bash 复制代码
[root@logstash ~]# ss -nlptu | grep 5044
tcp    LISTEN     0      1024   [::]:5044               [::]:*                   users:(("java",pid=1372,fd=104))

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

① 安装filebeat软件

bash 复制代码
[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 注释掉

② 检查配置并启动服务

bash 复制代码
[root@web ~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml
bash 复制代码
[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)

bash 复制代码
[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标签,判断数据来源(采用正则表达式)

bash 复制代码
[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/](http://121.37.211.232/ "http://121.37.211.232/") ![](https://i-blog.csdnimg.cn/direct/e4123e3bda844f71bbb8215967a39932.png) ## 小结: 本篇章节为**【第五阶段】ARCHITECTURE-DAY2**的学习笔记,这篇笔记可以初步了解到 搭建Logstash完成ELK集群、实现Web日志实时分析。 *** ** * ** *** Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

相关推荐
安科瑞刘鸿鹏3 分钟前
双碳时代,能源调度的难题正从“发电侧”转向“企业侧”
大数据·运维·物联网·安全·能源
小呆瓜历险记19 分钟前
ubuntu 22.04搭建SOC开发环境
linux·运维·ubuntu
码农101号20 分钟前
Linux中shell流程控制语句
linux·运维·服务器
ajassi200024 分钟前
开源 java android app 开发(十二)封库.aar
android·java·linux·开源
聪明小萝卜37 分钟前
无法与IP建立连接,未能下载VSCode服务器
运维·服务器
JuiceFS44 分钟前
深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
运维·后端
暗夜潜行1 小时前
ubuntu + nginx 1.26 + php7.4 + mysql8.0 调优
linux·运维·ubuntu
IU宝1 小时前
Linux下基础IO
linux·运维·服务器
鹅是开哥1 小时前
ZZU-ARM汇编语言实验2
linux·运维·服务器
HEY_FLYINGPIG1 小时前
解决华为云服务器无法ping通github问题
运维·服务器·华为云