ELK 学习总结

发布时间:2026/6/28 3:31:38
ELK 学习总结 前言ELK 是一套非常经典的日志收集、搜索、分析、可视化的平台它的出现完美的解决了管理多台服务器时日志分散无法集中管理、日志排查搜索困难、日志复杂无法被统计分析等问题。ELK 这个名字来自三个核心组件的首字母 Elasticsearch Logstash Kibana其中Logstash负责采集日志、流转过滤日志解析日志、清洗数据、格式转换、转发数据Elasticsearch负责存储最终数据、建立索引、提供搜索功能Kibana负责为 Elasticsearch 提供可视化界面如上所示早期的 ELK 采集日志的工作主要是由 Logstash 负责但由于 Logstash 太过笨重且系统资源占用严重后来就改用更轻量化的 Filebeat而 Logstash 则转而去负责日志数据的统一流转过滤工作。各组件扮演角色如下【注有关 ELK 的详细演进过程可参考这篇 文章】Filebeat负责采集日志Logstash负责统一流转过滤日志Elasticsearch负责存储最终数据、建立索引、提供搜索功能Kibana负责为 Elasticsearch 提供可视化界面注日志流转过滤其实就是对日志字段进行增删查改的动作Filebeat 也具备简单的日志流转过滤的功能但由于它位于终端侧且处理功能较为基础故对于统一流转过滤的任务来说还是不如 Logstash因此才出现了下图这样的架构。而如果我们的日志需求并不复杂并不需要数据流转过滤这种功能的话在 ELK 架构中 Logstash 完全可以被剔除掉只使用 Filebeat Elasticsearch Kibana 的组合即可。若业务更大、需求更复杂则可以采用以下的集群架构设计1、绘图器 - Kibana在 ELK 中Elasticsearch 是整个系统的核心存储与搜索引擎它承担了系统中几乎全部功能但它却只对外提供了一套 HTTP API 接口没有提供可视化的图形交互界面这使得普通用户使用它会非常的吃力。高级用户虽可通过REST API发送请求来增删改查数据、创建索引、执行搜索和聚合操作但也极为不便。为此Kibana 诞生了它是基于这套 API 接口来专门为 Elasticsearch 设计的可视化和交互界面通过 Kibana用户可以很方便的查询 Elasticsearch 中的数据、绘制图表、构建仪表盘轻松实现对日志数据的可视化和分析。Kibana 将 Elasticsearch 的功能划分成了四个类别分析、观测、安全、管理虽然界面提供的功能很多但其中大部分功能对于普通用户而言基本用不到为此我只对自己觉得有用的页面功能做一个简要的介绍以便能够更快的了解这套系统。1.1、分析 - Analytics分析菜单中的主要页面有 Discover、Dashboards、Maps、Visualize 库【1】Discover 页面功能介绍注1上图保存的作用是可以将这个搜索过滤条件作为一个可视化组件保存起来以供在自定义面板的时候可以去调用使用。2日志数据源又叫做数据视图它代表着我们可以从哪些索引存储中去读取日志数据。【① 处的子选项“管理数据视图”和 “Stack 管理-数据视图”是一个意思。】【2】Dashboards 常用预置面板【注与集成中的应用是一一对应的关系】系统日志 [Filebeat System] Syslog dashboard ECSApache HTTP 服务器日志 [Filebeat Apache] Access and error logs ECSNginx 日志[Filebeat Nginx] Overview ECSMySQL 日志 [Filebeat MySQL] Overview ECS【3】Visualize 库组件可视化组件Lens可拖拽式的图表工具系统可根据字段类型自动选择合适的聚合方式使用起来很智能、很省力。基于聚合传统的图表工具用户需要手动完成聚合的配置。文本主要用于仪表盘描述说明支持 Markdown 语法以及可调用的系统变量。Maps地理位置可视化图表只有当日志数据的字段中携带地理坐标字段时才适合使用此组件否则一片空白。【注filebeat 的 nginx 模块可以将访客 ip 直接转换成地理坐标字段因此该组件对于分析 nginx 日志来说很好用。切记内网 ip如 192.168.1.1这类的地址不会被转换为地理坐标字段。】1为了弄清Lens 图表和基于聚合的图表之间有什么区别我特地制作了一组关于统计年龄段及年龄段内工资范围的统计图用以观察二者之间的区别对比来看二者似乎也就是设置方式上的不同而已其它并无差别。2下面是关于文本组件的设置界面可以看到它的使用界面非常的简单而它的作用也无非就是描述说明、超链接跳转页面。3Maps 组件的设置相对来说还是比较麻烦的而且使用它还有一个前提条件那就是日志数据的字段中一定要包含地理位置坐标的字段才行否则该 Maps 组件将无法正常显示。此处只列举 3 个我已了解的图层作为示例EMS 边界以国家、省份、城市为单位去统计各区域的访问事件。【注联接中的左字段指的是地图上的国家代码右字段指的是日志数据中指定的带国家代码的字段如geo.src或geo.dst。】热力图通过颜色强度展示数据密度或数值大小让热点区域一目了然。【注以日志数据中的geo.coordinates为主要的参考字段不可指定其它字段。】集群把地理坐标密集的点聚合显示避免地图上出现“点过多看不清”的情况。【注以日志数据中的geo.coordinates为主要的参考字段指标中可指定其它字段作为计数统计。】注Maps 也属于可视化库中的组件只不过由于这个组件较为复杂和特殊故 Kibana 将其从可视化组件中拉了出来并单独为其设立了一个叫做 Maps 的菜单。1.2、观测 - Observability观测菜单中的页面功能多偏向于系统指标检测如同 grafana 那样。但在日志监控这个范畴里这个菜单中实际常用到的也就是实时日志流这个功能了它可以实时查看被监控端传输过来的日志信息以及该日志对应的日志上下文内容。1.3、管理 - Management管理菜单中的主要页面有集成、Stack 管理。【1】集成页面提供了 ELK 原生支持的众多常见应用这使得我们只需进行几个简单的步骤便能够将选中应用的日志监控添加到 ELK 系统中。例如下图这个针对 Linux 系统日志的监控注若你要监控的应用不再 ELK 支持的集成范围之内那么便需要你自行1制定 filebeat 配置文件2制作可视化组件3将组件统一整合到面板。注集成中的这两个功能在测试/学习的过程中可能会很有用上传文件、样例数据。【2】Stack 管理页面中的这几个功能采集管道、索引管理一般并不需要我们去配置它们但却需要知道它们以便能够加深对 ELK 的理解。索引模板类似模板或规则定义索引的结构、映射、设置、别名。当创建索引或数据流时可自动应用模板数据免去为创建索引重复指定相同的设置项。索引Elasticsearch 中存储数据的基本单位相当于数据库里的表专门用来存储文档数据。【注对索引模板的要求是可选状态】数据流数据流是索引的集合相当于是把多个索引归置到同一个文件夹中然后统一管理。【注对索引模板的要求是必选状态】处理器Filebeat在 filebeat 将数据发送到 Elasticsearch 之前对日志字段进行简单的流转过滤处理。采集管道Elasticsearch在 Elasticsearch 接收到 filebeat 发来的数据并准备将其写入到索引之前对日志字段进行复杂的流转过滤处理。日志数据被读取、上传、存储到索引的整个流程1filebeat 先从日志文件中取到最原始的日志数据然后在本地按照某种规则对其进行格式化字段处理不同的模块对日志的格式化处理的方式也是有所不同的这一点可在本地通过output.console去调试查看2根据本地配置文件中的处理器设置对日志字段进行再处理然后发往 Elasticsearch发送的时候会指定一个需要远端再处理的 pipline 管道名模块 input 日志一般都会携带 pipline自定义 input 日志可能没有。以及隐式指定对应的索引或数据流名称可在 Discover 中查看日志的 _index 字段3Elasticsearch 在收到日志数据之后会根据 pipline 管道的设置对日志字段进行再处理4最终才将这条日志数据存储在指定的索引中。2、存储器 - Elasticsearch注该服务启动起来即可基本没有什么需要频繁配置的地方。索引存储数据的逻辑容器类似关系型数据库的表Table。分片将索引划分成多个分片Shard来分布存储和并行搜索。主分片实际存储数据的基本单元。副本分片主分片的拷贝用于高可用和负载均衡。每个索引可以设置主分片数和副本数。注1一个索引一般对应一个主分片若索引数据量很大的话则一个索引可能会被分成多个主分片2副本分片相当于是对主分片的几次备份如果集群节点是 3 个那么副本分片可以设置成 2 个这样主节点保存一份主分片其它节点各保存一份副本分片这样当主节点损坏的时候索引数据不丢是。3、采集器 - FilebeatELK 的专属采集器是 beats 工具套件filebeat 只是该套件中一个专门负责日志文件采集的工具其它还有Filebeat负责日志采集。例如 系统日志 syslog 等、应用日志 nginx 等。Metricbeat负责指标监控数据采集。例如 CPU、内存等指标。Heartbeat负责存活检测/可用性监控。例如 网站是否在线、TCP 端口是否可访问等Winlogbeat负责采集Windows 事件日志。例如 系统事件、安全日志等Packetbeat负责网络流量分析。类似于轻量级的 Wireshark。Auditbeat负责Linux 安全审计。例如 用户行为、登录行为等由于本文仅关注日志的采集任务因此只介绍 Filebeat 相关的配置及用法至于其它工具的配置用法可参考 官方手册。3.1、配置文件Filebeat 配置文件中的内容主要分为四个部分全局参数、输入、输出、处理器其中输入、输出、处理器较为重要一些故以下会专门介绍它们各自的配置用法。【1】输入配置输入配置中的这些类型需要注意下filestream、syslog、input。#1两个文件流类型的输入配置 [/etc/filebeat/filebeat.yml] filebeat.inputs: - type: filestream id: my-filestream-id1 enabled: true paths: [/var/log/nginx/*.log] - type: filestream id: my-filestream-id2 enabled: true paths: - /var/log/*.log - /tmp/test.txt output.elasticsearch: hosts: [http://1.1.1.1:9200]#2文件流类型模块类型的输入配置 [/etc/filebeat/filebeat.yml] filebeat.inputs: - type: filestream id: my-filestream-id1 enabled: true paths: - /var/log/*.log - /tmp/test.txt - module: nginx access: enabled: true error: enabled: true output.elasticsearch: hosts: [http://1.1.1.1:9200]注1输入配置官方 参考手册、模块配置官方 参考手册。2模块类型的配置可通过filebeat modules enable nginx去直接启用无需如上述这般全都写在 filebeat.yml 配置文件之中。切记模块启用之后还需要手动将/etc/filebeat/modules.d/nginx.yml文件中的 enabled 处的 false 修改 为 true 才算是正式启用了该模块。【2】输出配置#1最基本的输出配置 [/etc/filebeat/filebeat.yml] filebeat.inputs: - type: filestream id: my-filestream-id1 enabled: true paths: - /var/log/*.log output.elasticsearch: hosts: [http://1.1.1.1:9200]#2多索引的输出配置 [/etc/filebeat/filebeat.yml] filebeat.inputs: - type: filestream id: nginx-log paths: [/var/log/nginx/*.log] fields: log_type: nginx - type: filestream id: app-log paths: [/var/log/app/*.log] fields: log_type: app output.elasticsearch: hosts: [http://1.1.1.1:9200] indices: - index: nginx-%{yyyy.MM.dd} when.equals: log_type: nginx - index: app-%{yyyy.MM.dd} when.equals: log_type: app#3本地调试的输出配置 [/etc/filebeat/console.yml] # 请注意此时 filebeat 的启动方式需要以命令的方式去启动而非后台服务的方式去启动 filebeat run -c console.yml filebeat.inputs: - type: filestream id: my-filestream-id paths: - /tmp/test.txt - module: nginx access: enabled: true output.console: pretty: true注输出配置官方 参考手册。【3】处理器配置# 删除日志中包含 DBG 的数据 [/etc/filebeat/console.yml] filebeat.inputs: - type: filestream paths: - /tmp/test.txt processors: - drop_event: when: regexp: message: ^DBG: output.console.pretty: true注处理器配置官方 参考手册。3.2、命令用法# 面板、索引模板、pipline 初始化 filebeat setup # 列出 ELK 支持集成的应用模块 filebeat modules list # 开启/禁止 监控应用日志的模块 filebeat modules enable/disable nginx # 测试指定配置文件的语法是否正确 filebeat test config -c filebeat.yml # 测试 filebeat 中 output 处配置的 Elasticsearch 的连接是否可用 filebeat test output -c filebeat.yml # 以指定配置文件的方式去启动 filebeat 程序 filebeat run -c testfile.yml4、杂项1参考文档Elasticsearch 中文手册、Elasticsearch 官方手册Kibana 中文手册、Kibana 官方手册Filebeat 官方手册博客园 hanease二丫讲梵2ELK 手动部署教程kibana、elasticsearch3Kibana 内置了几个样本数据以供我们在无需配置 Filebeat 的情况下也可以随时有数据供我们参考。不过这些数据发生时间可能有点久了因此在浏览的时候若无数据显示的话建议将时间过滤的条件添加为 100 年之前。【位置 1管理-集成-上传文件-样例数据-其他样例数据集】【位置 2 加载示例数据 | Kibana 用户手册 | Elastic 】4Kibana 的登录功能完全依赖于 Elasticsearch当 Elasticsearch 关闭了安全功能xpack.security.enabledfalse时Kibana 便也不再需要登录直接便进入了“无认证模式”。5Filebeat 的 system 模块依赖于 syslog、auth、这些系统日志而这些日志是由 rsyslog 服务制作出来的因此如果系统没有运行 rsyslog.service 服务的话这些日志便不会存在Filebeat 也将无日志数据可上传此时 system 模块也就相当于无效状态。6Filebeat 的 ngixn 模块可以自动将 nginx 访问日志中的 ip 信息转换为带 geoIP 格式的日志数据传输给 elasticsearch以供 Kibana 的 Maps 组件去使用。7Filebeat/Elasticsearch 会默认给事件添加timestamp字段而这个字段的值一般代表着这条日志数据被 Elasticsearch 接收时的时间。但如果 pipeline/module 从日志内容中解析出了事件的时间那么timestamp这个字段的值就不再是“接收时间”而是以日志携带的时间为准。【注这样做可以很好的防止日志积压滞留时导致采集到的日志与日志实际发生时间不相符的问题。】8自定义的 input 日志路径和 system 模块里的默认路径会不会冲突/重复不会各干各的。两者是“完全独立的两套采集机制”但如果路径重叠就会造成“重复采集”。【注意1由于所有 input 和模块的输入数据全部都会被当作一个数据源去存储因此在 web 端 discover 过滤的时候需要关注log.file.path以区分不同的日志路径2日志内容的格式无所谓哪怕是 123 这样的数据依旧可以被传输过去3不同模块的日志的区别可通过event.dataset : system.syslog的方式去过滤】9Filebeat 设置setup.template.name: filebeat只是“给 Filebeat 初始化出来的索引模板改了个名字”它不会改变模板内容、ECS 映射、pipeline、字段结构、数据流行为这些东西。例如在默认情况下Filebeat 可能创建 filebeat-8.15.0 这样的模板名。你改成setup.template.name: mylogs之后Filebeat 便会创建 mylogs 或者 mylogs-8.15.0 这样的名称。当索引模板改了之后这时候创建索引的时候索引模式就也要相应的改动了。10存疑filebeat setup是初始化 Filebeat 环境用的命令用来创建出适合当前系统环境的索引模板、解析规则和 Kibana 仪表盘数据。本命令一般只在 Filebeat 初次被安装时执行一次后续一般来说便不需要再执行它了。此外建议 filebeat 和 elasticsearch 的软件版本尽量保持一致避免出现版本不同、数据混乱的问题。*Docker 部署实例#1EK filebeat 组合【注filebeat 向 elastic 传输数据】 # 注意第一次执行可能会失败此时将当前目录下的 elasticsearch/* 赋予 777 权限后再次执行即可成功。 services: elasticsearch: image: elasticsearch:8.12.0 environment: - discovery.typesingle-node # 单节点部署 - xpack.security.enabledfalse # 免认证登录 - ES_JAVA_OPTS-Xms512m -Xmx512m ports: - 9200:9200 volumes: - ./elasticsearch/data:/usr/share/elasticsearch/data networks: - default kibana: image: kibana:8.12.0 environment: - ELASTICSEARCH_HOSTShttp://elasticsearch:9200 # 指定 Kibana 连接 Elasticsearch 服务器 - I18N_LOCALEzh-CN # 设置 Kibana 的界面为中文语言 ports: - 5601:5601 depends_on: - elasticsearch networks: - default networks: default: driver: bridge#2ELK filebeat 组合【注filebeat 向 logstash 传输数据】 services: elasticsearch: image: elasticsearch:8.12.0 ports: - 9200:9200 environment: discovery.type: single-node xpack.security.enabled: false volumes: - ./elasticsearch/data:/usr/share/elasticsearch/data networks: - default kibana: image: kibana:8.12.0 environment: - ELASTICSEARCH_HOSTShttp://elasticsearch:9200 # 指定 Kibana 连接 Elasticsearch 服务器 - I18N_LOCALEzh-CN # 设置 Kibana 的界面为中文语言 ports: - 5601:5601 depends_on: - elasticsearch networks: - default logstash: image: logstash:8.12.0 ports: - 5044:5044 depends_on: - elasticsearch networks: - default networks: default: driver: bridge#3集群 EK filebeat 组合 # 参照官方配置的 docker-compose.yml 文件即可 # 用法说明https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-elasticsearch-docker-compose # 模板位置https://github.com/elastic/elasticsearch/tree/main/docs/reference/setup/install/docker # 注意事项 #1需要修改环境变量文件 .env 中的 ELASTIC_PASSWORD、KIBANA_PASSWORD、STACK_VERSION 这三个变量的值例如 STACK_VERSION9.4.0 #2Kibana 界面语言默认是英文可在 docker-compose.yml 服务 Kibana 的环境变量中添加 I18N_LOCALEzh-CN 变量以改为中文界面。 #3登录 kibana 页面的时候登录账户应该使用 elastic:pass而非 kibana_system:pass。账户 kibana_system 是一个系统账户在启动 Kibana 时会用这个账户连接 Elasticsearch以管理/操作 Elasticsearch 后台。例如读取系统索引、管理索引模式、保存可视化对象等。 #4由于开启了安全验证Filebeat 在连接时需要在 output 部分配置账户密码以及证书如下【注证书获取位置docker volume inspect elk-cluster_certs 输出目录的 ca 目录之下。】 output.elasticsearch: hosts: [localhost:9200] protocol: https username: elastic password: elastic ssl.certificate_authorities: [/etc/filebeat/ca.crt]