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查询数据
略。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验