Linux--filebeat 日志采集及实战练习--EFK练习

如果我的能力,只能让我穷困潦倒,那么穷困潦倒就是我的价值。想干什么和能干什么,是两回事,这要根据自身的条件决定。只要不是我觉悟到的,你就给不了我,就算给了我,我也拿不住。只有自己觉到,悟到,才有可能做到,能做到的才是我的。

                                                                                                                                         --《天道》


目录

## 1. Filebeat原理

### 1.1 filebeat关于保持文件状态

### 1.2 filebeat确保一次交付

### 1.3 top命令简述

###  1.4 elsearch用户启动elasticsearch时出现"failed to obtain node locks"错误

### 1.5 elsearch用户启动elasticsearch时端口占用错误分析

## 2. 部署Filebeat环境

### 2.1 安装Filebeat软件

## 3. filebeat实例

### 3.1 读取自定义日志文件

#### 3.1.1 自定义字段

#### 3.1.2 输出到elasticsearch

### 3.2 读取Nginx日志文件

#### 3.2.1 Filebeat Module 配置读取nginx日志

##### 3.2.1.1 nginx module 配置

###### 3.2.1.1.1 ELK激活nginx模块出现"Error loading piowing Elasticsearch plugins"错误

#### 3.2.2 EFK练习

## 4. 总结


filebeat:占用内存少,启动快,作轻量级的日志采集。不是java开发,不支持"jps"命令,支持与logstash一起使用作功能性操作

logstash:笨重,启动慢,占用空间大。用的java后台开发,使用"jps"命令查看进程id

filebeat是用于"转发""集中日志数据"的轻量级数据采集器。

filebeat会监视指定的日志文件路径,收集日志事件并将数据转发到 elasticsearch,
logstash, redis kafka存储服务器。
Filebeat 包含两个主要组件, input( 输入 ) Harvester( 收割器 ) ,两个组件协同工作
将文件的尾部最新数据发送出去。
  • Harveste组件: 负责逐行读取单个文件的内容,然后将内容发送到输出。如果文件在读取时被删除或重命名,Filebeat将继续读取文件。
  • input组件: 输入负责管理收割机并找到所有要读取的源。该参数的源文件路径需要使用者手动配置。
  • Spooler(缓冲区): Harvester组件采集的数据进行统一的缓存,并发往目的端,以是 Elasticsearch, Logstash , kafka Redis 等。

## 1. Filebeat原理

1. filebeat 启动后, filebeat 通过 Input 读取指定的日志路径 ;
2. 为该文件日志启动收割进程 harvester, 每个收割进程读取一个日志文件的新内
容,并发送这些新的日志数据到处理程序 libbeat/spooler;
3. libbeat/spooler 会聚合这些事件,并将聚合的数据发送到为 Filebeat 配置的输
出。

### 1.1 filebeat关于保持文件状态

  • Filebeat保持每个文件的状态,并经常将状态刷新到注册表文件(data/registry)的磁盘。
  • 该状态用于记住收割机读取的最后一个偏移量,并确保发送所有日志行。
        如果无法访问输出(如Elasticsearch Logstash ), Filebeat 将跟踪发送的最后一
行,并在输出再次可用时继续读取文件。当 Filebeat 运行时,每个输入的状态信息也
会保存在内存中。重新启动 Filebeat 时,注册表文件中的数据将用于重建状态,
Filebeat 将每个 harvester 在从保存的最后偏移量继续读取。
        对于每个输入,Filebeat 会保存它找到的每个文件的状态。由于文件可以重命名或移
动,文件名和路径不足以标识文件。对于每个文件, Filebeat 存储唯一的标识符,以
检测文件是否以前被获取。
Linux基础:Linux查找文件时不是直接查找文件(不同目录下文件名有可能重名),而是通过inode编号找到其所在位置打开文件。

### 1.2 filebeat确保一次交付

1. Filebeat 保证事件将至少传送到配置的输出一次并且不会丢失数据。
2. Filebeat 能够实现这种行为,因为它将每个事件的传递状态存储在注册表文件
中。
        在定义的输出被阻止且未确认所有事件的情况下,Filebeat 将继续尝试发送事件,直
到输出确认其已接收到事件。
        如果Filebeat 在发送事件的过程中关闭,则在关闭之前不会等待输出确认所有事件。
        在关闭filebeat之前,不断重新更新 registry注册表,动态更新registry中的offset偏移量位置,达成动态更新。

### 1.3 top命令简述

Linux中的top命令主要用于实时监控系统的运行状态,包括系统负载、CPU利用分布、内存使用以及每个进程的资源使用情况

top命令的格式为“top[参数]”,其参数包括:

  • -b:批处理模式,用于将结果输出到文件或其它程序。
  • -c:显示完整的命令行,而不是截断版本。
  • -S:累积模式,用于显示多次更新结果。
  • -s:安全模式,去除交互命令的潜在风险。
  • -i:忽略闲置和僵死进程。
  • -u<用户名>:指定显示特定用户的进程。
  • -p<进程号>:指定显示特定进程的信息。
  • -n<次数>:设置top命令循环显示的次数,然后退出。
  • -d<秒数>:设置信息更新的周期。
  • -f或F:从当前显示中添加或删除项目。
  • -o或O:改变显示项目的顺序。
  • -l:切换显示平均负载和启动时间信息。
  • -m:切换显示内存信息。
  • -t:切换显示进程和CPU状态信息。
  • -q:退出程序。
  • -r:重新安排一个进程的优先级别。
  • -w或W:将当前设置写入~/.toprc文件,以保存用户偏好设置。

此外,top命令的输出主要包括三个部分,即顶部的系统状态显示、中间的任务列表、以及底部的输入/消息行,显示了系统的运行时间、负载平均值、任务数量和CPU状态等信息。

###  1.4 elsearch用户启动elasticsearch时出现"failed to obtain node locks"错误

原因分析:没有获得这个lock文件的操作权限,node.lock被其他进程使用了,这也是网上大多数的解释。解决方案:首先查看es的进程,然后杀掉。

# 使用解决方案前,可以先确认下node.lock是否被某个进程占用,命令如下

lsof /opt/es/elasticsearch-6.5.4/data/nodes/0/node.lock

## 查询结果

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
java    4515 elsearch   62wW  REG    8,2        0 9482913 /opt/es/elasticsearch-6.5.4/data/nodes/0/node.lock

## 已知是java进程留存

# 查询僵尸进程或使用"top"命令查看

ps -ef |grep elasticsearch或者java

# 杀死进程

kill -9 端口

# 切换用于进行重启

su - elsearch

cd /opt/es/elasticsearch-6.5.4/

./bin/elasticsearch -d

### 1.5 elsearch用户启动elasticsearch时端口占用错误分析

原因分析:一台主机未成功启动后其他主机会不断尝试连接未成功启动主机的9200和9300端口,导致端口占用,无法启动。

注:也有可能是用yum安装了其他版本的elasticelsearch,请使用"systemctl stop elasticsearch"命令将其停掉再重启elasticelsearch。

解决方法:用"jps"命令查看三台主机Elasticsearch端口,用"kill -9 端口"命令将其杀死并全部同时重启,或将主机重启再重启elasticelsearch。

## 2. 部署Filebeat环境

主机ES启动用户kibana启动用户Filebeat启动用户
192.168.182.131elsearch超级用户超级用户
192.168.182.153elsearch未下载未下载
192.168.182.154elsearch未下载未下载

### 2.1 安装Filebeat软件

下载(版本为: filebeat-6.5.4 ): https://www.elastic.c o/downloads/beats
# 创建安装目录
mkdir /opt/beats/
# 解压/root/下上传的压缩文件到创建目录
tar -xvf filebeat-6.5.4-linux-x86_64.tar.gz -C /opt/beats/
# 创建配置文件
cd /opt/beats/filebeat-6.5.4-linux-x86_64
vim beats.yml
## 配置文件内容如下: 
filebeat.inputs:
- type: stdin
  enabled: true
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true
# 启动filebeat
./filebeat -e -c beats.yml

启动成功及输出"hello"运行结果展示

filebeat相关参数解释:

-e:将日志输出到标准输出,并禁用系统日志和文件的输出,默认输出到sysloglogs

-c:指定配置文件

-d:调试输出,输出debug信息

配置文件"stdin"解释:

stdin:标准输入,不需要定义path,从标准输入获取

 filebeat参数介绍:

vim test.yml
# 内容如下:
filebeat.inputs:
- type: stdin
  enabled: true
output.console:
  pretty: true
  enable: true
# 测试输出: ./filebeat -e -c test.yml -d "publish"

结果展示:

## 3. filebeat实例

### 3.1 读取自定义日志文件

# 配置读取文件项 beats-log.yml
# 先创建日志目录
mkdir /opt//beats/logs/
# 在编辑配置文件
vim beats-log.yml
## 内容如下:
filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /opt/beats/logs/*.log
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true
# 启动filebeat
./filebeat -e -c beats-log.yml
# 复制一个终端,在/opt/beats/logs下创建a.log文件
cd /opt/beats/logs/
vim a.log
## 内容如下:
hello
nebula
#观察filebeat输出
可以看出,已经检测到日志文件有更新,立刻就会读取到更新的内容,并且输出到控 制台

#### 3.1.1 自定义字段
#配置读取文件项 beats-log-custom.yml
vim beats-log-custom.yml
## 内容如下:
filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /opt/beats/logs/*.log
# 添加自定义tag,便于后续的处理
  tags: ["web"] 
# 添加自定义字段
  fields: 
      from: nebula
# true为添加到根节点,false为添加到子节点中
  fields_under_root: true 
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true
# 启动filebeat
./filebeat -e -c beats-log-custom.yml
# 复制一个终端,在/opt/beats/logs下创建b.log文件
vim b.log
## 内容如下:
123

已检测到日志文件有更新,立刻会读取到更新内容,并输出到控制台

#### 3.1.2 输出到elasticsearch
# 配置文件编辑
vim beats-log-elasticsearch.yml
## 内容如下:
filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /opt/beats/logs/*.log
  tags: ["web"]
#添加自定义字段
  fields: 
      from: nebula
  fields_under_root: true
setup.template.settings:
#指定索引的分区数
  index.number_of_shards: 3 
output.elasticsearch : 
  hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
# 启动filebeat
./filebeat -e -c beats-log-elasticsearch.yml
# 复制一个终端,在#/opt/beats/logs追加a.log文件
vim a.log
## 内容如下:
123
# 在日志文件中输入新的内容进行测试:echo "abcdefg" >> a.log(或者指定绝对路径/opt/beats/logs/)

追加效果展示:

### 3.2 读取Nginx日志文件

# 配置文件编辑
vim beats-log-nginx.yml
## 内容如下:
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/*.log
  tags: ["nginx"]
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
# 启动
./filebeat -e -c beats-log-nginx.yml
浏览器地址输入http://192.168.182.131/多次请求,在如下页面可以看到多次请求
可以看到,在 message 中已经获取到了 nginx 的日志,但是,内容并没有经过处理,只是读取到原数据

#### 3.2.1 Filebeat Module 配置读取nginx日志
Filebeat 中,有大量的 Module ,可以简化我们的配置,直接就可以使用,如下:

        其中,内置了很多的module,但是都没有启用,如果需要启用需要进行enable

操作:
./filebeat modules enable nginx # 启动
./filebeat modules disable nginx # 禁用
##### 3.2.1.1 nginx module 配置

# 启用nginx模块

        ./filebeat modules enable nginx

        启用之后modules.d目录下的模块会出现没有带.disabledyml,这个文件就是我们

的模块配置文件
        cd /opt/beats/filebeat-6.5.4-linux-x86_64/modules.d
        打开nginx.yml
vim nginx.yml
# 内容如下:
- module: nginx
  # Access logs
  access:
    enabled: true
    var.paths: ["/usr/local/nginx/logs/access.log*"]
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    # var.paths:
    # Error logs
error:
    enabled: true
    var.paths: ["/usr/local/nginx/logs/error.log*"]
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    # var.paths

配置filebeat

# 配置文件编辑
cd /opt/beats/filebeat-6.5.4-linux-x86_64
vim nebula-nginx.yml
## 内容如下:
filebeat.inputs:
#- type: log
# enabled: true
# paths:
# - /usr/local/nginx/logs/*.log
# tags: ["nginx"]
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
# 启动
./filebeat -e -c nebula-nginx.yml
###### 3.2.1.1.1 ELK激活nginx模块出现"Error loading piowing Elasticsearch plugins"错误

        ELK之elasticsearch插件导致filebeat没有上传日志至elasticsearch解决办法--可能是插件未安装导致。

# 查看elasticsearch主机插件是否安装--集群内三台主机都要安装
/opt/es/elasticsearch-6.5.4/bin/elasticsearch-plugin list
# 安装插件
cd /opt/es/elasticsearch-6.5.4/
./bin/elasticsearch-plugin install ingest-user-agent
./bin/elasticsearch-plugin install ingest-geoip
## 若已经安装,卸载了重新安装一次即可(无需重启elasticsearch)
### 卸载
./bin/elasticsearch-plugin remove ingest-user-agent
./bin/elasticsearch-plugin remove ingest-geoip
### 安装
./bin/elasticsearch-plugin install ingest-user-agent
./bin/elasticsearch-plugin install ingest-geoip
# 切换用户重启elsearch
su - elsearch 
cd /opt/es/elasticsearch-6.5.4/
./bin/elasticsearch -d
# 查看集群日志是否启动成功
tail -f logs/es-clusters.log

elasticsearch错误数据采集展示:

#### 3.2.2 EFK练习
# filebeat配置文件编辑
vim beats-log-nginx-dashboard.yml
## 内容如下:
filebeat.inputs:
setup.template.settings:
  index.number_of_shards: 3
output.elasticsearch:
  hosts: ["192.168.182.131:9200","192.168.182.153:9200","192.168.182.154:9200"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.kibana:
  host: "192.168.182.131:5601"
setup.dashboards.enabled: true
# 启动
cd /opt/beats/filebeat-6.5.4-linux-x86_64
./filebeat -e -c beats-log-nginx-dashboard.yml

## 4. 总结

       主要实现了用Elastic Stack的系列产品对Nginx日志进行数据采集,数据存储,和数据可视化。Filebeat用于监控、收集服务器日志文件,Elasticsearch用于收集nginx服务的访问数据,Kibana对 Elasticsearch 索引中的数据进行搜索、查看、交互操作,并且可视化展示出来。 每次nginx服务被访问都会产生日志,并实时记录,最后进行可视化展示出来。

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值