当前位置: 首页 > news >正文

ELK日志系统

文章目录

  • 1 概述
    • 1_什么是Elastic (ELK) Stack(ELKB)
    • 2_Elastic Stack 的发展历程(名字的由来)
    • 3_Elastic Stack的组成部分
  • 2 用途和使用场景
  • 3 Logstash简介:管道
    • 1_工作原理
    • 2 数据采集:Inputs
    • 3 数据过滤:Filter
    • 4 数据存储:output
    • 5 服务的安装与启动
  • 4 Beats简介:轻量级日志采集器
    • 1_Logstash功能如此强大,为什么还要用Beats
    • 2_Beats的基本特性
    • 3_组件
  • 5 Kibana简介:可视化和数据分析
  • 6 基于ELK搭建日志采集系统
    • 1 Logstash服务
    • 2_部署Filebeat
    • 3_Filebeat + Logstash + Elasticsearch
    • 4_基于Filebeat采集SpringBoot日志
    • 5_其他常见日志采集
    • 6_可视化

1 概述

1_什么是Elastic (ELK) Stack(ELKB)

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。

  • Elasticsearch 是一个搜索和分析引擎;
  • Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。
  • Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

Elastic Stack 是 ELK Stack 的更新换代产品

2_Elastic Stack 的发展历程(名字的由来)

一切都起源于 Elasticsearch…

这个开源的分布式搜索引擎基于 JSON 开发而来,具有 RESTful 风格。它使用简单,可缩放规模,十分灵活,因此受到用户的热烈好评,而且如大家所知,围绕这一产品还形成了一家专门致力于搜索的公司。

引入 Logstash 和 Kibana

Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,我们引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。

Elastic Stack 包含各种功能(之前统一称为 X-Pack),从企业级安全性和开发人员友好型 API,到 Machine Learning 和图表分析,非常全面;借助这些功能,您能够对所有类型的数据进行大规模采集、分析、搜索和可视化。

在这里插入图片描述

向 ELK 中加入了 Beats

无论是在混乱如麻的文本型文档中找到前 N 个结果,还是分析安全事件,再或是自由地对指标进行切片和切块,全球社区一直都在使用 ELK 不断地拓展使用范围。

“我只想对某个文件进行 tail 操作,”用户表示。我们用心倾听。在 2015 年,我们向 ELK Stack 中加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats。

Elastic Stack 名字的由来

ELK 这个名称又要变了,的确如此。把它叫做 BELK?BLEK?ELKB?当时的确有过继续沿用首字母缩写的想法。然而,对于扩展速度如此之快的堆栈而言,一直采用首字母缩写的确不是长久之计。

就这样,Elastic Stack 这个名字应运而生了

在这里插入图片描述

和用户一直以来熟知并喜爱的开源产品一模一样,只是集成程度更高了,功能更加强大了,入门也更加容易了,而且可以带来无限可能。

3_Elastic Stack的组成部分

Elasticsearch

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

ES是 Elastic Stack 的核心,采用集中式数据存储,可以通过机器学习来发现潜在问题。

ES能够执行及合并多种类型的搜索(结构化数据、非结构化数据、地理位置、指标),支持 PB级数据的秒级检索。(不进行过多介绍)

Kibana

Kibana 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让您在 Elastic Stack 中进行导航。

您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成

Logstash

Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到合适的的“存储库”中。

Beats

Beats 是一套免费且开源的轻量级数据采集器,集合了多种单一用途数据采集器。

它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。

2 用途和使用场景

为什么要使用ELK?

  • 严格按照开发标准来说,开发人员是不能登录生产服务器查看日志数据的
  • 一个应用可能分布于多态服务器,难以查找
  • 同一台服务区可能部署多个应用,日志分散难以管理
  • 日志可能很大,单个文件通常能达到GB级别,日志无法准确定位,日志查询不方便且速度慢
  • 通常日志文件以非结构化存储,不支持数据可视化查询。
  • 不支持日志分析(比如慢查询日志分析、分析用户画像等)。

使用场景:

  • 采集业务日志
  • 采集Nginx日志
  • 采集数据库日志,如MySQL
  • 监控集群性能指标
  • 监听网络端口
  • 心跳检测

3 Logstash简介:管道

开源的流数据处理、转换(解析)和发送引擎,可以采集来自不同数据源的数据,并对数据进行处理后输出到多种输出源,Logstash是Elastic Stack的重要组成部分。

1_工作原理

Logstash的每个处理过程均已插件的形式实现,Logstash的数据处理过程主要包括: Inputs , Filters , Outputs 三部分,如图:

在这里插入图片描述

2 数据采集:Inputs

Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择,可以同时从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

在这里插入图片描述

此过程(inputs)用于从数据源获取数据,常见的插件如 beats、file、kafka、rabbitmq、log4j、redis等。

参考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html

3 数据过滤:Filter

数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便进行更强大的分析和实现商业价值。

Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响:

  • 利用 Grok 从非结构化数据中派生出结构
  • 从 IP 地址破译出地理坐标
  • 将 PII 数据匿名化,完全排除敏感字段
  • 简化整体处理,不受数据源、格式或架构的影响

在这里插入图片描述

过滤器是Logstash管道中的数据处理器,input 时会触发事件,触发 filter 对数据进行 transport,即转换解析各种格式的数据,常见的过滤器插件如下:

  • grok :解析和构造任意文本。是Logstash过滤器的基础,广泛用于从非结构化数据中导出结构,当前,Grok是Logstash中将非结构化日志数据解析为结构化和可查询内容的最佳方法。
  • mutate :对事件字段执行常规转换。支持对事件中字段进行重命名,删除,替换和修改。
  • date :把字符串类型的时间字段转换成时间戳类型
  • drop :完全删除事件,例如调试事件。
  • clone :复制事件,可能会添加或删除字段。
  • geoip :添加有关IP地址地理位置的信息。

4 数据存储:output

Elasticsearch 是官方首选输出方式,但并非唯一选择。Logstash 提供多种输出选择,目前官方支持200 多个插件。

在这里插入图片描述

output 用于数据输出,常见的插件如:

  • elasticsearch:最高效、方便、易于查询的存储器,最有选择,官方推荐!
  • file:将输出数据以文件的形式写入磁盘。
  • graphite:将事件数据发送到graphite,graphite是一种流行的开源工具,用于存储和绘制指标http://graphite.readthedocs.io/en/latest/。
  • statsd:将事件数据发送到statsd,该服务“通过UDP侦听统计信息(如计数器和计时器),并将聚合发送到一个或多个可插拔后端服务”。

5 服务的安装与启动

官方文档:https://www.elastic.co/guide/en/logstash/current/index.html

下载地址:https://www.elastic.co/downloads/past-releases#logstash

服务安装:安装与启动过程与 ES 一致,直接解压即可。

4 Beats简介:轻量级日志采集器

Beats 是一套免费且开源的轻量级数据采集器,集合了多种单一用途数据采集器。

它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。

1_Logstash功能如此强大,为什么还要用Beats

就功能而言,Beats是远不如Logstash的,得益于Java生态优势,Logstash功能明显更加强大。

但是Logstash在数据收集上的性能表现饱受诟病(消耗大量内存),Beats的诞生,其目的就是为了取代 Logstash Forwarder(INPUTS)。

2_Beats的基本特性

开源:Beats 是一个免费且开放的平台,集合了多种单一用途数据采集器,各司其职,功能分离。社区中维护了上百个beat,社区地址:这里。

轻量级:体积小,职责单一、基于go语言开发,具有先天性能优势,不依赖于Java环境,对服务器资源占用极小。Beats 可以采集符合 Elastic Common Schema(ECS)要求的数据,可以将数据转发至 Logstash 进行转换和解析。

可插拔:Filebeat 和 Metricbeat 中包含的一些模块能够简化从关键数据源(例如云平台、容器和系统,以及网络技术)采集、解析和可视化信息的过程(只需运行一行命令,即可开始探索)。

高性能:对 CPU、内存和 IO 的资源占用极小。

可扩展:由于Beats开源的特性,如果现有Beats不能满足开发需要,我们可以自行构建,并且完善Beats社区。

3_组件

在这里插入图片描述

  • Filebeat:文件日志监控采集 ,主要用于收集日志数据
  • Metricbeat:进行指标采集,指标可以是系统的,也可以是众多中间件产品的,主要用于监控系统和软件的性能
  • Packetbeat: 是一个实时网络数据包分析器,通过网络抓包、协议分析,基于协议和端口对一些系统通信进行监控和数据收集。可以将其与Elasticsearch一起使用,以提供应用程序监视和性能分析系统。
  • Heartbeat:心跳检测 (在配置的Url中喊一句:喂,有活着的么?有的话吱个声!)
  • Winlogbeat:Windows事件日志
  • Auditbeat:审计数据(收集审计日志)
  • Functionbeat:云服务生成的日志和指标收集器

5 Kibana简介:可视化和数据分析

Kibana 是一个免费且开放的可视化系统,能够让您对 Elasticsearch 数据进行可视化,并让您在 Elastic Stack 中进行导航。

您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。

一张图片,胜过千万行日志

在这里插入图片描述

6 基于ELK搭建日志采集系统

简述基本流程

在这里插入图片描述

1 Logstash服务

下载解压完成后进入其 config 目录查看其配置文件(7.17)

logstash.yml ──────┬─ 全局配置│
pipelines.yml ─────┬─ 定义加载哪些 *.conf 管道文件│
logstash-sample.conf ── 示例管道配置(input-filter-output),默认提供了ES示例jvm.options ─────── JVM 参数
startup.options ─── 服务启动参数(Linux服务启动时生效)
log4j2.properties ─ 日志格式与级别设置

Stdin(标准化输入)和 Stdout(标准化输出)插件

启动标准化输入/输出

./bin/logstash -e 'input{stdin{}} output{stdout{}}'
# 输入什么,返回给你什么:自行测试
# stdin和stdout可以方便我们在搭建ELK时检查哪一个环节存在问题(参考上述流程图)。
# stdin可以让我们很方便的手动输入或者使用管道符使用指定的文件

Filter插件(grok)

新建一个测试配置文件,其内容如下:

input {stdin {}
}filter {grok {match => {"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }# 还可以指定正则文件的地址 dir...}
}output {stdout {codec => "json"}
}

指定新建的配置文件

bin/logstash -f logstash-filter.conf

加载完毕后输入如下内容(假设这就是产生的日志,观察输出的结果):

55.3.244.1 GET /index.html 15824 0.043

其他插件根据当前的版本在Logstash章节提供的官方文档中查找对应的说明,比如Java、log4j。

2_部署Filebeat

文件日志监控采集 ,主要用于收集日志数据

下载和安装

地址:https://www.elastic.co/cn/downloads/past-releases#filebeat

文档:https://www.elastic.co/guide/en/beats/filebeat/

解压:

tar -zxvf filebeat-7.17.17-linux-x86_64.tar.gz

工作原理

当启动 Filebeat 时,它会启动一个或多个 inputs,这些输入会在日志数据指定的位置中查找。

对于 Filebeat 定位的每个日志,Filebeat 都会启动一个harvester,与文件一一对应。

每个 harvester(收割机) 读取单个日志以获取新内容并将新日志数据发送到libbeat,libbeat 聚合事件并将聚合数据发送到配置的输出地址。

在这里插入图片描述

核心配置:inputs 配置

filebeat.inputs:- type: log# 启用设置为trueenabled: truepaths:# 可以看到这里使用里通配符,这样可以识别多个文件- /opt/es/logs/*.log# 不是同一个业务的日志一定要分开存储- type: filestreamid: my-filestream-id # 如果有多个日志源Logstash可以用此属性做区分if ...in...idenabled: falsepaths:- /var/log/*.logfilebeat.config.modules:path: ${path.config}/modules.d/*.ymlreload.enabled: false
setup.template.settings:index.number_of_shards: 1
setup.kibana:
output.elasticsearch:# Array of hosts to connect to,默认就是输出到ES中的(数组)hosts: ["http://192.168.200.129:9200/"]# 设置生成的索引名称# index: "%{[fields.log_type]}-%{[agent.version]}-%{+yyyy.MM.dd}"
processors:- add_host_metadata:when.not.contains.tags: forwarded- add_cloud_metadata: ~- add_docker_metadata: ~- add_kubernetes_metadata: ~

启动 Filebeat

./filebeat -e -c filebeat.yml

/data/registry/filebeat/log.json文件中可以查看到如下内容

在这里插入图片描述

3_Filebeat + Logstash + Elasticsearch

ELK基本基本组件

在这里插入图片描述

常见应用日志采集目标架构

在这里插入图片描述

4_基于Filebeat采集SpringBoot日志

将Filebeat输出到ES改为输出到Logstash中:注释掉ES配置,开启Logstash输出

# ============================== Filebeat inputs ===============================
filebeat.inputs:- type: logenabled: truepaths:# 准备一个常见的spring boot项目输出的日志:访问10次出一次error,其他时候都是info- /elk/logs/*.log# 注意: beats这里配置的时候默认按行采集,如果出现java的异常跟踪栈会产生多行日志,所以需要添加如下配置multiline.type: pattern # 使用正则匹配,可以不写multiline.pattern: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}' # 正则表达式: springboot日志以日期开头如2025-x-ymultiline.negate: true # true: 以匹配的做新行, false: 反之multiline.match: after # 将非匹配行追加到前一行末尾,形成完整的堆栈日志
# ------------------------------ Logstash Output -------------------------------
output.logstash:
# The Logstash hostshosts: ["192.168.200.129:5044"]# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"

修改Logstash配置

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {beats {port => 5044}
}
# 配置filter
# 在/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.3.4/patterns/ecs-v1有正则匹配示例
filter {grok {match => {# 通用 Spring Boot 日志格式 org.slf4j.Logger"message" => "^%{TIMESTAMP_ISO8601:timestamp} +%{LOGLEVEL:level} +%{NUMBER:pid} --- \[%{DATA:thread}\] +%{JAVACLASS:logger} +: %{GREEDYDATA:log_message}"}}# 捕捉 Java 异常堆栈 trace 信息if [message] =~ /Exception|^\tat / {grok {match => {"message" => ["^%{JAVACLASS:exception_class}: %{GREEDYDATA:exception_message}","^(\tat %{JAVACLASS:exception_class}\.%{WORD:exception_method}\(%{DATA:exception_file}:%{NUMBER:exception_line}\))"]}break_on_match => false}}# 将时间字段转为 Logstash 时间戳date {match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS"]target => "@timestamp"timezone => "Asia/Shanghai"}# 可选:删除原始时间字段,避免重复mutate {remove_field => ["timestamp"]}
}output {# 输出到ESelasticsearch {hosts => ["http://192.168.200.129:9200"]index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"}# 根据日志区分输出索引: if "error" in [message] {es}# if "xx" in [id] 根据beats中的id区分数据源# 仅做调试使用stdout {codec => rubydebug}
}

指定上述的配置文件,启动Filebeat和Logstash观察效果。

5_其他常见日志采集

基于Filebeat采集Nginx日志,nginx可以为我们提供已经格式化好了的json日志形式,只需如下配置

# 在http{}内
log_format json '{''"@timestamp": "$time_iso8601",''"http_host": "$http_host",''"client_ip": "$remote_addr",''"request": "$request",''"status": "$status",''"size": "$body_bytes_sent",''"refer": "$http_referer",''"request_time": "$request_time",''"http_user_agent": "$http_user_agent"'
'}';access_log  /var/log/nginx/access.log  json;

不要忘记告诉filebeat,采集的是json数据

- type: logenabled: truepaths:# /var/log/*.log# /var/log/messages# /var/log/elk/error.log/var/log/nginx/access.logtags: ["access"]json.keys_under_root: truejson.add_error_key: truejson.message_key: log

基于Filebeat采集Syslog

vim /etc/rsyslog.conf

修改配置文件

*.* @@127.0.0.1:514

重启系统日志服务

systemctl restart rsyslog

查看日志服务状态

systemctl status rsyslog

配置 logstash-outputs(input参考文档):

if "udp" in [tags] {elasticsearch {hosts => ["http://192.168.3.181:9200","http://192.168.3.182:9200"]index => "syslog-udp-%{[@metadata][version]}-%{+YYYY.MM.dd}"}
}
if "tcp" in [tags] {elasticsearch {hosts => ["http://192.168.3.181:9200","http://192.168.3.182:9200"]index => "syslog-tcp-%{[@metadata][version]}-%{+YYYY.MM.dd}"}
}

使用 netcat(nc)测试

nc -u 127.0.0.1 8080 < ./udp.yml
  • -d 后台模式
  • -h 帮助信息
  • -i secs 延时的间隔
  • -l 监听模式,用于入站连接
  • -L 连接关闭后,仍然继续监听
  • -n 指定数字的IP地址,不能用hostname
  • -o file 记录16进制的传输
  • -p port 本地端口号
  • -r 随机本地及远程端口
  • -s addr 本地源地址
  • -t 使用TELNET交互方式
  • -u UDP模式
  • -v 详细输出–用两个-v可得到更详细的内容
  • -w secs timeout的时间
  • -z 将输入输出关掉–用于扫描时

packetbeat

sudo ./packbeat -e -c packetbeat.yml -strict.parms=false

6_可视化

相关文章:

  • Kubernetes控制平面组件:高可用 APIServer
  • 详解反射型 XSS 的后续利用方式:从基础窃取到高级组合拳攻击链
  • 定制一款国密浏览器(10):移植SM2算法前,解决错误码的定义问题
  • 【Linux】软件管理机制和软件安装
  • 软件测试--自动化测试1
  • 【操作系统原理02】进程的描述与控制
  • 基于机器学习 LSTM 算法的豆瓣评论情感分析系统
  • matlab论文图一的地形区域图的球形展示Version_1
  • 【Matlab】中国东海阴影立体感地图
  • 梅施CPQ + AI:开启智能AI与报价软件的新潮流
  • 大模型Rag - 文本分块
  • libevent的bufferevent测试用例和使用方法(附带源码)
  • 腾讯wxg企业微信 后端开发一面
  • 基于Ubuntu2504部署OpenStack E版
  • uv:重新定义Python开发效率的下一代工具链
  • GNU,GDB,GCC,G++是什么?与其他编译器又有什么关系?
  • Android TTY设备调用流程和简单分析
  • Vue3 本地打包启动白屏解决思路!! !
  • Springboot+vue3开发项目——热点事件
  • YOLO拓展-NMS算法
  • 大悦城:去年净亏损29.77亿元,三年累计亏损超70亿元
  • 8个月女婴被指受虐后体重仅6斤?潮州警方:未发现虐待,父母有抚养意愿
  • “80后”辽宁石油化工大学副校长杨占旭已任阜新市领导
  • 一图看懂|特朗普政府VS美国顶尖高校:这场风暴如何刮起?
  • 鲁比奥在法国只字不提关税,美国威胁下欧盟勉力维持统一战线
  • 特朗普叫停已许可的海上风电,机构将美国风电前景下调40%