day01-elasticstack-all

一.elasitcstack概述

1. 什么是ElasticStack?

所谓的ElasticStack别名为elk stack。

ELK指的是三个技术栈:

	- ElasticSearch,简称: es
		数据库,应用场景为数据的快速检索。
		但凡和搜索框相关的,都会用ES进行数据的查询。
		
	- Logstash:	
		采集数据,日志聚合,处理数据,将数据写入到ES存储库。
		
	- Kibana:
		用于出图展示数据。

2. 常用的架构

EFK常用架构:
	- ElasticSearch
	- Filebeat: 
		采集数据写入ES集群。
	- Kibana

ELFK:
	- ElasticSearch
	- Filebeat: 
	- Logstash
	- Kibana
	
ELKF+KAFKA:
	- zookeeper 
	- kafka

二.ElasticSearch

1. 什么是elasticsearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。

作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。

说白了,ES的核心作用就是存储数据和快速进行模糊查询。

2.下载ES软件包

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.23-amd64.deb

svip:
[root@elk91 ~]# wget http://192.168.11.253/Linux93/ElasticStack/day01-/softwares/elasticsearch-7.17.22-amd64.deb

3.安装软件包

[root@elk91 ~]# dpkg -i elasticsearch-7.17.22-amd64.deb 

4.添加别名【可选】

[root@elk91 ~]# vim ~/.bashrc 
...
alias yy='egrep -v "^#|^$"'
...
[root@elk91 ~]# source  ~/.bashrc 
[root@elk91 ~]# 

5.修改配置文件

[root@elk91 ~]# yy /etc/elasticsearch/elasticsearch.yml 
cluster.name: oldboyedu-linux93
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.type: single-node
[root@elk91 ~]# 

相关参数说明:
	cluster.name: 
		指定ES集群的名称
	path.data: 
		指定数据目录
	path.logs: 
		指定日志目录
	network.host: 
		指定宿主机的监听IP。
	http.port: 9200
		对外提供http|https接口的端口。
	transport.port: 9300
		集群内部数据传输的端口,会优先启动该端口选举master后在启动9200端口。
	discovery.type: 
		指定ES集群的类型,single-node表示的是单点。

6.启动ES服务

[root@elk91 ~]# systemctl enable --now elasticsearch

7.检查监听的端口号

[root@elk91 ~]# ss -ntl | egrep "92|93"
LISTEN 0      4096               *:9200            *:*          
LISTEN 0      4096               *:9300            *:*          
[root@elk91 ~]# 

8.测试访问

[root@elk93 ~]# curl 10.0.0.91:9200
{
  "name" : "elk91",
  "cluster_name" : "oldboyedu-linux93",
  "cluster_uuid" : "rYh3jwB7SFu0MKTiwCfOwQ",
  "version" : {
    "number" : "7.17.22",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "38e9ca2e81304a821c50862dafab089ca863944b",
    "build_date" : "2024-06-06T07:35:17.876121680Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.3",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
[root@elk93 ~]# 
[root@elk93 ~]# 
[root@elk93 ~]# curl 10.0.0.91:9200/_cat/nodes
10.0.0.91 15 97 12 0.24 0.19 0.08 cdfhilmrstw * elk91
[root@elk93 ~]# 
[root@elk93 ~]# curl 10.0.0.91:9200/_cat/nodes?v
ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
10.0.0.91           15          97   0    0.22    0.18     0.08 cdfhilmrstw *      elk91
[root@elk93 ~]# 

三.ES服务卸载

1.停止ES服务

[root@elk91 ~]# systemctl disable --now elasticsearch.service 

2.删除数据

[root@elk91 ~]# \rm -rf  /var/{lib,log}/elasticsearch/ /tmp/*  /etc/elasticsearch

3.删除软件

[root@elk91 ~]# dpkg -r elasticsearch 
[root@elk91 ~]#
[root@elk91 ~]# rm -f elasticsearch-7.17.22-amd64.deb 

四.ES集群搭建

1.所有节点部署ES环境

[root@elk91 ~]# wget http://192.168.11.253/Linux93/ElasticStack/day01-/softwares/elasticsearch-7.17.23-amd64.deb
[root@elk91 ~]# dpkg -i elasticsearch-7.17.23-amd64.deb 

[root@elk92 ~]# wget http://192.168.11.253/Linux93/ElasticStack/day01-/softwares/elasticsearch-7.17.23-amd64.deb
[root@elk92 ~]# dpkg -i elasticsearch-7.17.23-amd64.deb 

[root@elk93 ~]# wget http://192.168.11.253/Linux93/ElasticStack/day01-/softwares/elasticsearch-7.17.23-amd64.deb
[root@elk93 ~]# dpkg -i elasticsearch-7.17.23-amd64.deb 

2.修改配置文件

[root@elk91 ~]# yy /etc/elasticsearch/elasticsearch.yml 
cluster.name: oldboyedu-linux93
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["10.0.0.91", "10.0.0.92","10.0.0.93"]
cluster.initial_master_nodes: ["10.0.0.91", "10.0.0.92","10.0.0.93"]
[root@elk91 ~]# 

相关参数说明:
	discovery.seed_hosts:
		当前ES集群的主机列表。
		
	cluster.initial_master_nodes:
		集群启动时首次参与master选举的节点列表。

3.将配置文件拷贝到其他节点

[root@elk91 ~]# scp /etc/elasticsearch/elasticsearch.yml  10.0.0.92:/etc/elasticsearch
[root@elk91 ~]# scp /etc/elasticsearch/elasticsearch.yml  10.0.0.93:/etc/elasticsearch

4.启动ES集群(同时重启)

[root@elk91 ~]# systemctl enable --now elasticsearch.service 

[root@elk92 ~]# systemctl enable --now elasticsearch.service 

[root@elk93 ~]# systemctl enable --now elasticsearch.service 

5.所有检查端口是否监听

[root@elk91 ~]# ss -ntl | egrep "9200|9300"
LISTEN 0      4096               *:9200            *:*          
LISTEN 0      4096               *:9300            *:*          
[root@elk91 ~]# 


[root@elk92 ~]# ss -ntl | egrep "9200|9300"
LISTEN 0      4096               *:9200            *:*          
LISTEN 0      4096               *:9300            *:*          
[root@elk92 ~]# 


[root@elk93 ~]# ss -ntl | egrep "9200|9300"
LISTEN 0      4096               *:9200            *:*          
LISTEN 0      4096               *:9300            *:*          
[root@elk93 ~]# 

6.查看集群节点信息

[root@elk93 ~]# curl 10.0.0.91:9200/_cat/nodes
10.0.0.92 13 97 41 0.97 0.63 0.25 cdfhilmrstw - elk92
10.0.0.93 21 97 16 0.29 0.29 0.11 cdfhilmrstw * elk93
10.0.0.91 14 97 13 0.18 0.22 0.09 cdfhilmrstw - elk91
[root@elk93 ~]# 
[root@elk93 ~]# curl 10.0.0.91:9200/_cat/nodes?v
ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
10.0.0.92           13          97   3    0.89    0.62     0.25 cdfhilmrstw -      elk92
10.0.0.93           21          97   1    0.27    0.28     0.11 cdfhilmrstw *      elk93
10.0.0.91           15          97   6    0.16    0.21     0.09 cdfhilmrstw -      elk91
[root@elk93 ~]# 
[root@elk93 ~]# for i in `seq 91 93`;do curl -s 10.0.0.$i:9200 | egrep '_name|_uuid';done
  "cluster_name" : "oldboyedu-linux93",
  "cluster_uuid" : "ORn4OMKKTWK22EGCMguvmw",
  "cluster_name" : "oldboyedu-linux93",
  "cluster_uuid" : "ORn4OMKKTWK22EGCMguvmw",
  "cluster_name" : "oldboyedu-linux93",
  "cluster_uuid" : "ORn4OMKKTWK22EGCMguvmw",
[root@elk93 ~]# 

五.ES集群API写入和读取数据

1.写入数据

[root@elk93 ~]# curl -X POST -H "Content-Type:application/json" 10.0.0.91:9200/oldboyedu-linux93/_doc -d '{"name":"oldboy","hobby":"Linux"}'

2.读取数据

[root@elk93 ~]# apt -y install jq
[root@elk93 ~]#
[root@elk93 ~]# curl -s 10.0.0.92:9200/oldboyedu-linux93/_search | jq .hits.hits
[
  {
    "_index": "oldboyedu-linux93",
    "_type": "_doc",
    "_id": "G5X5kZEB01ugxUIpgtcW",
    "_score": 1,
    "_source": {
      "name": "oldboy",
      "hobby": "Linux"
    }
  }
]
[root@elk93 ~]# 

ES集群无法启动拍错思路:

	1.软件下载有问题 
重新下载即可。

	2.安装后缺失文件
从其他节点拷贝过来即可。

	3.根据情况查看日志
		3.1 启动日志 
[root@elk91 ~]# tail -100f /var/log/elasticsearch/oldboyedu-linux93.log 

		3.2 查看启动的服务类型
[root@elk91 ~]# journalctl -u elasticsearch.service -f

六.基于kibana读取数据

1.kibana概述

使用 Kibana 针对大规模数据快速运行数据分析,以实现可观测性、安全和搜索。


对来自任何来源的任何数据进行全面透彻的分析,从威胁情报到搜索分析,从日志到应用程序监测,不一而足。
 

说白了,kibana就是从ES查询数据并展示数据。

2.下载kibana

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.23-amd64.deb


svip:
[root@elk91 ~]# wget http://192.168.11.253/Linux93/ElasticStack/day01-/softwares/kibana-7.17.23-amd64.deb

3.安装软件包

[root@elk91 ~]# dpkg -i kibana-7.17.23-amd64.deb 

4.修改配置文件

[root@elk91 ~]# vim /etc/kibana/kibana.yml 
[root@elk91 ~]# 
[root@elk91 ~]# yy  /etc/kibana/kibana.yml 
server.port: 5601
server.host: "0.0.0.0"
server.name: "oldboyedu-linux93-kibana"
elasticsearch.hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"]
i18n.locale: "zh-CN"
[root@elk91 ~]# 

5.启动kibana

[root@elk91 ~]# systemctl enable --now kibana

6.查看监听的端口

[root@elk91 ~]# ss -ntl | grep 5601
LISTEN 0      511          0.0.0.0:5601      0.0.0.0:*          
[root@elk91 ~]# 

7.访问WebUI

http://10.0.0.91:5601/app/management/data/index_management/indices	

七.ES的常见术语

	- index: 索引
		索引是一个逻辑的存储单元,一般用于标识不同的业务类型,因此索引的名称大家可以自定义。
		用户基于索引进行数据的读写。
		
	- shard: 分片
		一个索引最少有一个分片,数据存储在分片中。
		当索引的分片数量大于1时,ES集群自动将分片分散地存储在不同的数据节点,而是实现了数据的分布式存储。
		
	- replica: 副本
		每个分片有0个或多个副本,若副本数量大于0时,则可以实现对主分片的备份。为了方便理解将其分片主分片(primary shard)和副本分片(replica shard)。
		主分片(primary shard)和副本分片(replica shard)不能在同一台节点。
		
		主分片负责数据的读写,而副本分片只负责数据的读取和同步。
		
		当主分片和副本分片较多时,默认的写入策略为: "(主分片数量 + 副本分片数量) / 2 + 1",说白了,就是半数以上写入机制。
		
		比如1个主分片,和1个副本分片总共2个分片的数据相同,其写入策略为: (1 + 1) / 2 + 1,结果为:2,表示主分片和副本分片都必须写入成功则判定成功。
		
	- document: 文档
		ES本身就是一个文档型数据库,和mangoDB类似。
		
		每个文件的数据分为两个部分: 元数据和源数据。
		
		元数据(metadata):
			用于描述源数据的数据。
			常见的字段如下:
				_index:
					表示文档隶属于哪个索引。
				
				_id:
					表示文档的唯一标识。
					
				_source:
					代表用户实际存储的数据。
		
		源数据(source data):
			用户实际写入的数据。
		
		
	- allocation(分配):
      指的是将索引的不同分片和副本分配到整个ES集群的过程,这个分配过程由ES集群自己实现。

ES相关的面试题

	Q1: ES集群监听的端口及使用协议?
		9200:
			http|https
			ES集群对外提供Web访问。
		
		9300:
			tcp
			集群内部数据传输,包括master选举,数据同步。
			
			
	Q2: ES集群有几种颜色?
		- green:
			绿色,表示集群中所有的主分片和副本分片都可以正常访问,说明集群处于正常状态。
			
		- yellow:
			黄色,表示集群中有部分副本分片无法访问。
			
		- red:
			红色,表示集群中有部分主分片无法访问。

八.通过kibana的WebUI查询ES数据

1.准备测试数据

[root@elk93 ~]# curl -X POST -H "Content-Type:application/json" 10.0.0.91:9200/_bulk -d '
{ "index" : { "_index" : "oldboyedu-linux93-06"} }
{"name":"赵壮壮","hobby":["学习","玩手机","看美女"]}
{ "index" : { "_index" : "oldboyedu-linux93-01"} }
{"name":"张宗宇","hobby":["大长腿","学习"]}
'

2.创建索引模式

kibana的索引模式用于匹配ES集群的一个或多个索引。
 
oldboyedu-linux93*

EFK架构采集nginx访问日志并分析

1.配置文件

[root@elk91 ~]# cat /etc/filebeat/05-nginx-es.yaml
filebeat:
inputs:

  • type: log
    json:
    keys_under_root: true
    add_error_key: true
    overwrite_keys: true
    paths:
    • /var/log/nginx/access.log*

数据到ES集群

output.elasticsearch:
hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"]
[root@elk91 ~]#
[root@elk91 ~]#

2.启动实例

[root@elk91 ~]# filebeat -e -c /etc/filebeat/05-nginx-es.yaml

3.kibana查询数据

略,见视频。.kibana查询数据
略,见视频。

九.通过其他方式查询集群颜色

1.通过es-head组件查询

略。

2.基于官方的查询

###2.1 测试数据 
curl -X POST -H "Content-Type:application/json" 10.0.0.91:9200/_bulk -d '
{ "index" : { "_index" : "oldboyedu-linux93-06"} }
{"name":"王锦赫","hobby":["学习","linux"]}
{ "index" : { "_index" : "oldboyedu-linux93-06"} }
{"name":"刘强强","hobby":["大长腿","睡觉"]} 
'
###2.2 查询数据【发现数据的对象数量可能没有及时更新,我们查询的数据是它自己的缓存,保守估计:5min会缓存一次】
[root@elk93 ~]# curl -s 10.0.0.91:9200/_cat/indices?v
health status index                            uuid                   pri rep docs.count docs.deleted store.size pri.store.size
...
green  open   oldboyedu-linux93-06             dbi11h7KQWiyR85NSeB_wg   1   1          1            0     13.8kb          4.6kb
...
green  open   oldboyedu-linux93-01             0gxVmiPkRjiq5DgRHAc87A   1   1          1            0      9.2kb          4.6kb
green  open   oldboyedu-linux93                oWzZBmHPS7mB9uq0smBCYQ   1   1          1            0      8.9kb          4.4kb
[root@elk93 ~]# 
[root@elk93 ~]# curl -s 10.0.0.91:9200/_cat/indices?v
health status index                            uuid                   pri rep docs.count docs.deleted store.size pri.store.size
...
green  open   oldboyedu-linux93-06             dbi11h7KQWiyR85NSeB_wg   1   1          3            0     18.4kb          9.2kb
...
green  open   oldboyedu-linux93-01             0gxVmiPkRjiq5DgRHAc87A   1   1          1            0      9.2kb          4.6kb
green  open   oldboyedu-linux93                oWzZBmHPS7mB9uq0smBCYQ   1   1          1            0      8.9kb          4.4kb
[root@elk93 ~]# 

filebeat的架构

   input :
     数据从哪来
      stdin
     1og
     tcp
   output :
      数据到哪去。
      Console
      elasticsearch

十.部署filebeat

1.filebeat概述

无论您是从安全设备、云、容器、主机还是 OT 进行数据收集,Filebeat 都将为您提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁杂。

说白了,filebeat的核心就是采集日志并将日志发送到我们期望的目的端。本质核心就是input(数据从哪来)和output(数据到哪去)。

filebeat默认是按行读取数据。

2.下载filebeat软件包

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.23-amd64.deb

svip:
[root@elk91 ~]# wget http://192.168.11.253/Linux93/ElasticStack/day01-/softwares/filebeat-7.17.23-amd64.deb

3.安装filebeat

[root@elk91 ~]# dpkg -i filebeat-7.17.23-amd64.deb 

4.编写filebeat的配置文件

[root@elk91 ~]# cat /etc/filebeat/01-stdin-stdout.yaml 
# 数据从标准输入来
filebeat.inputs:
- type: stdin

# 数据到终点
output.console:
  pretty: true
[root@elk91 ~]# 
[root@elk91 ~]# 

5.启动filebeat实例

[root@elk91 ~]# filebeat -e -c /etc/filebeat/01-stdin-stdout.yaml 

相关参数说 :
	-c <config>:
		指定的是配置文件 
	-e :
		开启调试模式,将日志输出到终端。
		
输入内容:
11111111111111111111111111111111111111111111111111111111111111

输出内容:很明显,数据被封装到了一个"message"字段中。
{
  "@timestamp": "2024-08-27T08:36:45.619Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "log": {
    "offset": 0,
    "file": {
      "path": ""
    }
  },
  "message": "11111111111111111111111111111111111111111111111111111111111111",
  "input": {
    "type": "stdin"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk91"
  },
  "agent": {
    "type": "filebeat",
    "version": "7.17.23",
    "hostname": "elk91",
    "ephemeral_id": "517ef1a9-ff88-4954-b1b0-30a56003193e",
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356",
    "name": "elk91"
  }
}
2024-08-27T08:36:46.620Z	ERROR	file/states.go:125	State for  should have been dropped, but couldn't as state is not finished.

十一.filebeat监听tcp端口,将数据输出到终端

1.编写配置文件

[root@elk91 ~]# cat /etc/filebeat/02-tcp-console.yaml 
# 数据从监听的指定tcp端口来
filebeat.inputs:
- type: tcp
  host: "0.0.0.0:9000"

# 数据到终点
output.console:
  pretty: true
[root@elk91 ~]# 

2.启动filebeat实例

[root@elk91 ~]# filebeat -e -c /etc/filebeat/02-tcp-console.yaml 

3.发送测试数据

[root@elk93 ~]# echo "www.oldboyedu.com" | nc 10.0.0.91 9000

4.观察filebeat是否采集到数据

{
  "@timestamp": "2024-08-27T08:49:08.672Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "message": "www.oldboyedu.com",
  "log": {
    "source": {
      "address": "10.0.0.93:41596"
    }
  },
  "input": {
    "type": "tcp"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk91"
  },
  "agent": {
    "name": "elk91",
    "type": "filebeat",
    "version": "7.17.23",
    "hostname": "elk91",
    "ephemeral_id": "cb41126f-2dfd-4ffb-9edf-54fa0cbb7045",
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356"
  }
}

十二.filebeat采集本地文件输出数据到终端

1.编写filebeat的配置文件

[root@elk91 ~]# cat /etc/filebeat/03-log-console.yaml
# 数据从监听的指定文件来
filebeat.inputs:
- type: log
  paths:
    - /tmp/oldboyedu-linux93.log

# 数据到终点
output.console:
  pretty: true
[root@elk91 ~]# 

2.启动filebeat实例

[root@elk91 ~]# filebeat -e -c /etc/filebeat/03-log-console.yaml

3.写入测试数据

[root@elk91 ~]# echo www.oldboyedu.com > /tmp/oldboyedu-linux93.log
[root@elk91 ~]# 
[root@elk91 ~]# ll /tmp/oldboyedu-linux93.log
-rw-r--r-- 1 root root 18 Aug 27 08:54 /tmp/oldboyedu-linux93.log
[root@elk91 ~]# 
[root@elk91 ~]# cat /tmp/oldboyedu-linux93.log
www.oldboyedu.com
[root@elk91 ~]# 

4.观察终端输出

{
  "@timestamp": "2024-08-27T08:54:49.658Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "log": {
    "offset": 0,
    "file": {
      "path": "/tmp/oldboyedu-linux93.log"
    }
  },
  "message": "www.oldboyedu.com",
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk91"
  },
  "agent": {
    "hostname": "elk91",
    "ephemeral_id": "7f74b8f9-b3ea-4b00-bdc5-7b98b481ff3d",
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356",
    "name": "elk91",
    "type": "filebeat",
    "version": "7.17.23"
  }
}

5.验证filebeat采集数据是按行读取

[root@elk91 ~]# echo -n linux93
[root@elk91 ~]# echo -n ABCD >> /tmp/oldboyedu-linux93.log 
[root@elk91 ~]# 
[root@elk91 ~]# 
[root@elk91 ~]# cat /tmp/oldboyedu-linux93.log
www.oldboyedu.com
linux93ABCD[root@elk91 ~]# 
[root@elk91 ~]# 
[root@elk91 ~]# 

6.验证终端是否有数据

很明显,没有数据!

7.再次发送数据

[root@elk91 ~]# echo abc >> /tmp/oldboyedu-linux93.log
[root@elk91 ~]# 
[root@elk91 ~]# cat /tmp/oldboyedu-linux93.log
www.oldboyedu.com
linux93ABCDabc
[root@elk91 ~]# 

8.再次验证终端是否有数据

{
  "@timestamp": "2024-08-27T08:59:44.694Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk91"
  },
  "agent": {
    "ephemeral_id": "7f74b8f9-b3ea-4b00-bdc5-7b98b481ff3d",
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356",
    "name": "elk91",
    "type": "filebeat",
    "version": "7.17.23",
    "hostname": "elk91"
  },
  "log": {
    "offset": 18,
    "file": {
      "path": "/tmp/oldboyedu-linux93.log"
    }
  },
  "message": "linux93ABCDabc"
}

9.再次发送测试数据,注意观察文件的字节大小

[root@elk91 ~]# ll /tmp/oldboyedu-linux93.log
-rw-r--r-- 1 root root 33 Aug 27 08:59 /tmp/oldboyedu-linux93.log
[root@elk91 ~]# 
[root@elk91 ~]# cat /tmp/oldboyedu-linux93.log
www.oldboyedu.com
linux93ABCDabc
[root@elk91 ~]# 
[root@elk91 ~]# echo Linux >> /tmp/oldboyedu-linux93.log
[root@elk91 ~]# 
[root@elk91 ~]# cat /tmp/oldboyedu-linux93.log  # 写了5个字母,但是有6个字节,其中有一个隐藏字符(换行符)。
www.oldboyedu.com
linux93ABCDabc
Linux
[root@elk91 ~]# ll /tmp/oldboyedu-linux93.log
-rw-r--r-- 1 root root 39 Aug 27 09:01 /tmp/oldboyedu-linux93.log
[root@elk91 ~]# 

10.再次验证终端是否有数据

{
  "@timestamp": "2024-08-27T09:01:29.703Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "host": {
    "name": "elk91"
  },
  "agent": {
    "version": "7.17.23",
    "hostname": "elk91",
    "ephemeral_id": "7f74b8f9-b3ea-4b00-bdc5-7b98b481ff3d",
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356",
    "name": "elk91",
    "type": "filebeat"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "log": {
    "offset": 33,
    "file": {
      "path": "/tmp/oldboyedu-linux93.log"
    }
  },
  "message": "Linux",
  "input": {
    "type": "log"
  }
}

11.重启filebeat实例

[root@elk91 ~]# filebeat -e -c /etc/filebeat/03-log-console.yaml


很明显,此时不会有数据,因为数据已经采集过了,如果此时再次采集会导致数据的重复采集。

filebeat会默认将采集文件的偏移量(offset)存储在一个目录中:"/var/lib/filebeat/registry/filebeat"


[root@elk91 ~]# tail -1 /var/lib/filebeat/registry/filebeat/log.json 
{"k":"filebeat::logs::native::2097162-64768","v":{"id":"native::2097162-64768","prev_id":"","source":"/tmp/oldboyedu-linux93.log","type":"log","FileStateOS":{"inode":2097162,"device":64768},"identifier_name":"native","offset":39,"timestamp":[181278814,1724749471],"ttl":-1}}
[root@elk91 ~]# 


综上所述,filebeat之所以没有采集到文件,原因是该文件有记录。既然如此咱们停止服务后,将这个目录删除,就会重新采集数据。


那如果我向从ABCD的位置点继续往后采集该如何操作呢??? 当然,如果你针对像这样做,就可以直接修改偏移量。


[root@elk91 ~]# vim /var/lib/filebeat/registry/filebeat/log.json 
[root@elk91 ~]# 
[root@elk91 ~]# tail -1 /var/lib/filebeat/registry/filebeat/log.json 
{"k":"filebeat::logs::native::2097162-64768","v":{"timestamp":[773313652,1724750000],"source":"/tmp/oldboyedu-linux93.log","prev_id":"","offset":25,"ttl":-1,"type":"log","FileStateOS":{"inode":2097162,"device":64768},"identifier_name":"native","id":"native::2097162-64768"}}
[root@elk91 ~]# 

12.再次观察终端的输出结果

{
  "@timestamp": "2024-08-27T09:13:56.355Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "log": {
    "file": {
      "path": "/tmp/oldboyedu-linux93.log"
    },
    "offset": 25
  },
  "message": "ABCDabc",
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk91"
  },
  "agent": {
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356",
    "name": "elk91",
    "type": "filebeat",
    "version": "7.17.23",
    "hostname": "elk91",
    "ephemeral_id": "089c48f1-0be7-4acd-831e-644b65bb3d9c"
  }
}
{
  "@timestamp": "2024-08-27T09:13:56.355Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.23"
  },
  "agent": {
    "ephemeral_id": "089c48f1-0be7-4acd-831e-644b65bb3d9c",
    "id": "9d67a9b9-adad-4e7b-9a41-1e7cf6711356",
    "name": "elk91",
    "type": "filebeat",
    "version": "7.17.23",
    "hostname": "elk91"
  },
  "log": {
    "offset": 33,
    "file": {
      "path": "/tmp/oldboyedu-linux93.log"
    }
  },
  "message": "Linux",
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "host": {
    "name": "elk91"
  }
}

总结: filebeat采集文本日志的特点:

	- 1.按行读取数据;
	- 2.每次采集数据后,都会在本地记录采集文件的偏移量(offset);

十三.filebeat配置nginx的json日志文件解析

1.安装nginx

[root@elk91 ~]# apt -y install nginx

2.修改nginx的配置文件

[root@elk91 ~]# vim /etc/nginx/nginx.conf 
...
	  log_format oldboyedu_nginx_json '{"timestamp":"$time_iso8601",'
								  '"vhost":"$server_addr",'
								  '"clientip":"$remote_addr",'
								  '"SendBytes":$body_bytes_sent,'
								  '"responsetime":$request_time,'
								  '"upstreamtime":"$upstream_response_time",'
								  '"upstreamhost":"$upstream_addr",'
								  '"http_host":"$host",'
								  '"uri":"$uri",'
								  '"domain":"$host",'
								  '"xff":"$http_x_forwarded_for",'
								  '"referer":"$http_referer",'
								  '"tcp_xff":"$proxy_protocol_addr",'
								  '"http_user_agent":"$http_user_agent",'
								  '"status":"$status"}';

		access_log  /var/log/nginx/access.log  oldboyedu_nginx_json;
			
		# access_log /var/log/nginx/access.log;
		...
[root@elk91 ~]# 
[root@elk91 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@elk91 ~]# 
[root@elk91 ~]# systemctl restart nginx

3.访问nginx服务

[root@elk93 ~]# while true; do curl 10.0.0.91;sleep 0.5;done

4.查看nginx的访问日志

[root@elk91 ~]# tail  -100f /var/log/nginx/access.log 
...
{"@timestamp":"2024-08-27T09:45:15+00:00","host":"10.0.0.91","clientip":"10.0.0.93","SendBytes":612,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"10.0.0.91","uri":"/index.nginx-debian.html","domain":"10.0.0.91","xff":"-","referer":"-","tcp_xff":"-","http_user_agent":"curl/7.81.0","status":"200"}

5.编写filebeat采集数据

[root@elk91 ~]# cat /etc/filebeat/04-nginx-console.yaml
# 数据从监听的指定文件来
filebeat:
  inputs:
  - type: log
    # 如果message的字段是json格式,我们可以定义json相关的配置。
    json:
      # 当keys_under_root的值为true,会自动解析json格式并将字段放在顶级字段中。
      # 一旦配置该属性,则意味着message字段被移除。
      keys_under_root: true
      # 当json格式解析错误时,可以将错误信息写入到event事件(指的是filebeat采集的每一条数据)中。
      add_error_key: true
      # 如果解析后的字段和filebeat自己的元数据资源冲突,则覆盖。
      overwrite_keys: true
    paths:
      - /var/log/nginx/access.log*

# 数据到ES集群
output:
  console:
    pretty: true
[root@elk91 ~]# 

6.启动filebeat实例观察输出

[root@elk91 ~]# filebeat -e -c /etc/filebeat/04-nginx-console.yaml
...
{
  "@timestamp": "2024-08-27T09:59:34.983Z",
  ...
  "vhost": "10.0.0.91",
  "tcp_xff": "-",
  "upstreamtime": "-",
  ...
  "clientip": "10.0.0.93",
  "SendBytes": 612,
  "status": "200",
  "uri": "/index.nginx-debian.html",
  ...
  "responsetime": 0,
  "timestamp": "2024-08-27T09:59:34+00:00",
  ...
  "referer": "-",
  "http_user_agent": "curl/7.81.0",
  "http_host": "10.0.0.91",
  "log": {
    "offset": 43368,
    "file": {
      "path": "/var/log/nginx/access.log"
    }
  },
  "domain": "10.0.0.91",
  "xff": "-",
  "upstreamhost": "-"
}

- 项目案例:

EFK架构采集nginx访问日志并分析

1.配置文件

[root@elk91 ~]# cat /etc/filebeat/05-nginx-es.yaml
filebeat:
  inputs:
  - type: log
    json:
      keys_under_root: true
      add_error_key: true
      overwrite_keys: true
    paths:
      - /var/log/nginx/access.log*

# 数据到ES集群
output.elasticsearch:
  hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"] 
[root@elk91 ~]# 
[root@elk91 ~]# 

2.启动实例

[root@elk91 ~]# filebeat -e -c /etc/filebeat/05-nginx-es.yaml

3.kibana查询数据

略。

posted @   ~沈鹏~  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示