ELK日志监控分析系统的探索与实践(一):利用Filebeat监控boot日志

简介: ELK是一套完整的日志收集、展示解决方案,由ElasticSearch、Logstash 和 Kibana三个单词首字母拼接而成。其中:Logstash负责将日志进行过滤、收集,再传输到Elasticsearch上;Elasticsearch负责把日志作为索引进行存储并且构造对应倒排索引;Kibana负责可视化呈现日志,需要查询时Kibana调用Elasticsearch进行日志数据的查询;

写在前面


由于公司项目较多,所部署服务产生的日志也较多,以往查看服务器日志只能通过xshell、putty等SSH工具分别连接每台服务器,然后进入到各个服务器,执行Linux命令查看日志,这样可能会带来以下问题:

  • 类似xshell等工具需要购买或破解才能长期使用
  • 若服务器无法直连、需要跳板机跳转的情况下,连接多台服务器需要在xshell工具配置代理,配置过程较为繁琐
  • 若居家办公或在家中临时定位紧急bug,同样需要安装工具和配置一套代理用于连接到服务器查看日志
  • 不同的服务部署在不同的服务器上,需要在Xshell等工具上打开多个窗口来回切换查看
  • 查看日志需要会一些的常用的Linux命令

刚好前段时间学习过ELK日志分析系统的相关知识,不仅可以用来分析Nginx、Apache、MySQL等工具和服务的日志,还可以用于分析Springboot项目生成的服务日志,另外结合Metricbeat工具也可以用来监控服务器内存、CPU、磁盘等相关指标。于是在公司测试环境的服务器上尝试搭建了一套ELK,探索能否解决以上日志查看面临的痛点问题。

在正式开始前,先简单介绍一下ELK及相关实现原理:

一、什么是ELK

ELK 是elastic公司提供的一套完整的日志收集、展示解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana;

  • ElasticSearch简称ES,由Java 语言编写,它是一个建立在全文搜索引擎Apache Lucene基础上的、实时的、分布式的搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析;
  • Logstash是一个具有实时传输能力的数据收集引擎,用来进行数据收集(如:读取文本文件)、解析,并将数据发送给ES;
  • Kibana为Elasticsearch提供了分析和可视化的Web平台。它可以在Elasticsearch的索引中查找,交互数据,并生成各种维度表格、图形;

在ELK中beats是用于数据采集的工具,相较于logstash,beats是更轻量级的工具。Beats 平台集合了多种单一用途数据采集器,这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。Beats平台提供了如下的几种常见的具体收集日志的工具:

工具名称

对应解释

Filebeat

日志文件

Metricbeat

指标

Packetbeat

网络数据

Winlogbeat

windows事件日志

Auditbeat

审计数据

Heartbeat

运行心跳监控

二、ELK收集Springboot项目日志的实现原理

Springboot服务产生的日志,会将日志数据保存到磁盘中的.log文件中,因此需要在各个服务所在的服务器上分别部署轻量级的日志收集工具filebeat,实现原理如下:

  • filebeat:部署在需要采集日志的各个服务器上,负责监听log文件,Filebeat会将日志数据收集并结构化后传输到Logstash上;
  • Logstash:负责将日志进行过滤、收集,再传输到Elasticsearch上;
  • Elasticsearch:负责把日志作为索引进行存储并且构造对应倒排索引;
  • Kibana:负责可视化呈现日志,需要查询时Kibana调用Elasticsearch进行日志数据的查询;

当然,也可以直接将日志传输给ES,但是会面临以下弊端:

  • 当需要收集的节点较多时,传输的log量和次数就会大量增加,如果filebeat直接传输给es,就会占用掉es的大量资源。应该让es专注与数据查询和处理,让数据发给logstash,以此作一层缓冲;
  • logstash有多种过滤器可以使用,通过logstash做一些过滤,可以过滤掉无效的日志;

三、部署方案

注意事项:

  • Elasticsearch、Logstash、Kibana、Filebeat 版本需保持一致;
  • ELK需部署在和被监控的服务同一套内网环境下;
  • 若部署在云服务上,需在云服务器所在的安全组设置中,将ELK各个组件所用到的端口号一一放开;
  • 如有防火墙,需将ELK各个组件所用到的端口号一一加到防火墙安全策略中

服务器

服务

默认端口号

作用

备注

192.168.16.21

Elasticsearch

9200

日志存储、日志查询、日志解析

192.168.16.22

Logstash

5044

日志收集、日志过滤

192.168.16.4

(外网地址:xx.xxx.xx.xx)

Kibana

5601

可视化展示

如需外网访问,Kibana需部署在外网可以访问的服务器上

192.168.16.6

192.168.16.11

......

Filebeat

日志收集

各个需要采集日志的服务器上都部署

四、部署过程

1.安装elasticsearch

1)创建elk用户

elasticsearch无法在root用户下运行,因此需要创建一个新用户

useradd elk
passwd elk

2)更改elasticsearch目录所属用户

chown-R elk:elk elasticsearch-7.8.0 # -R 参数表示递归子目录

3)配置elasticsearch

编辑config目录下的配置文件:vi elasticsearch.yml

# 按照如下内容放开注释或修改cluster.name: my-application
node.name: node-1
path.data: /home/ELK/elasticsearch-7.8.0/data
path.logs: /home/ELK/elasticsearch-7.8.0/logs
bootstrap.memory_lock: falsenetwork.host: 192.168.16.21
http.port: 9200# 末尾增加两行内容,否则会报错bootstrap.system_call_filter: falsecluster.initial_master_nodes: ["node-1"]

4)常见报错及解决

vm.max_map_count 数量太小

报错如上图所示,解决办法:

① 切换到root用户,修改配置文件sysctl.conf:vi /etc/sysctl.conf,在末尾行添加内容:vm.max_map_count=262144

# sysctl settings are defined through files in# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.## Vendors settings live in /usr/lib/sysctl.d/.# To override a whole file, create a new file with the same in# /etc/sysctl.d/ and put new settings there. To override# only specific settings, add a file with a lexically later# name in /etc/sysctl.d/ and put new settings there.## For more information, see sysctl.conf(5) and sysctl.d(5).vm.max_map_count=262144

② 保存后执行命令:sysctl -p,使配置生效

bootstrap checks failed 问题

报错如上图所示,解决办法:

① 切换到root用户,修改配置文件limits.conf:vi /etc/security/limits.conf,在末尾行添加内容:

* soft nofile 65536* hard nofile 131072

② 再次启动后,浏览器访问:http://ip:9200/ 出现以下页面返回则表示启动成功

启动时报错提示“org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks”

原因:(重复启动)线程被占用,已存在es线程,且正在运行中

通过启动脚本启动后不加载任何模块

如上图所示,脚本启动后只有如上提示,不加载任何模块,解决办法:

① 再次新建一个用户,如elastic:useradd elastic

② 将elasticsearch-7.8.0更改属组:

chown-R elastic:elastic elasticsearch-7.8.0

③ 切换至elastic用户:su elastic

④ 启动elasticsearch

5)配置脚本启动方式

① 确认启动无问题后,先暂时Ctrl+c关闭服务,创建后台启动脚本:startup.sh,内容如下:

/home/ELK/elasticsearch-7.8.0/bin/elasticsearch -d# -d 参数为后台启动

② 赋予startup.sh执行权限

chmod+x startup.sh

2.安装logstash

logstash可以用root用户运行,logstash也是需要在jdk1.8以上版本运行,所以可以不用像elasticsearch那样必须用新建一个elk用户

① 将logstash-7.8.0.tar.gz通过xftp等工具复制到指定服务器

② 解压logstash-7.8.0.tar.gz:tar -xvf logstash-7.8.0.tar.gz

③ 创建启动脚本:startup.sh,内容如下:

nohup /home/ELK/logstash-7.8.0/bin/logstash -f config.conf >/dev/null 2>&1 &

④ 赋予脚本执行权限:chmod +x startup.sh

⑤ 通过脚本启动:./startup.sh

出现如下图所示提示,表示启动成功:

3.安装Kibana

1)修改配置文件kibana.yml

server.port: 5601server.host: "192.168.16.4"elasticsearch.hosts: ["http://192.168.16.21:9200"]
kibana.index: ".kibana"i18n.locale: "zh-CN"

2)创建启动脚本startup.sh

startup.sh内容如下

# startup.sh nohup /home/ELK/kibana-7.8.0/bin/kibana --allow-root

注意事项:

① 一定要加 --allow-root参数,允许root用户允许,否则会报错

② 创建完赋予用户执行权限:chmod u+x startup.sh

3)启动kibana

使用./startup.sh启动

4)浏览器访问

http://ip:5601

4.部署并配置Filebeat

① 将filebeat-7.8.0-linux-x86_64.tar.gz文件复制到需要采集日志的各个服务器上

② 解压缩文件:tar -xvf filebeat-7.8.0-linux-x86_64.tar.gz

③ 进入解压后的目录,编辑filebeat.yml,内容如下

# ============================== Filebeat inputs ===============================filebeat.inputs: 
# ==========RS log==========# 定义要采集项目的log标签,如rs项目debug类型的日志,标签可以设为:rs_debug,并声明log路径 - type: log
  enabled: true  tags: ["rs_debug"]
  paths:
- /home/rs/logs/debug.log
# 采集同一台服务器上的多个服务,使用 - 进行分隔,如mn项目的error类型的日志- type: log
  enabled: true  tags: ["mn_error"]
  paths:
- /home/mn/logs/error.log
# ============================== Filebeat modules ==============================filebeat.config.modules:
# Glob pattern for configuration loading  path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading  reload.enabled: false# ======================= Elasticsearch template setting =======================setup.template.settings:
  index.number_of_shards: 1  index.number_of_replicas: 0# Kibana 配置,Kibana所在服务器的内网地址setup.kibana:
  host: "192.168.16.4:5601"# ================================== Outputs ===================================# Logstash Output 注意:Logstash和Elasticsearch选择一个作为日志输出即可,不能同时选择output.logstash:
  hosts: ["192.168.16.22:5044"]
# Processors 配置,保持默认processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~

5.配置Logstash

新建一个config.conf文件,主要逻辑:先从logstash中检索日志是否存在指定的标签名(前面在Filebeat中定义的标签名,与此处对应),若存在,则将日志进行重新命名再传递给下一个环节ES

具体内容如下:

input {
    grok {
        match => { "message"=> "%{COMBINEDAPACHELOG}"}
    }
    geoip {
source=> "clientip"    }
}
output {
if"rs_debug"in [tags] {
    elasticsearch {
        hosts => [ "192.168.16.21:9200" ]
        index => "[test_rs_debug_log]"    }
}
if"mn_error"in [tags] {
    elasticsearch {
        hosts => [ "192.168.16.21:9200" ]
        index => "[mn_error_log]"    }
}
}

6.Kibana中创建索引

① 打开索引模式

左上角菜单--Management--Stack Management--Kibana--索引模式

② 输入索引名称,匹配具体日志

输入具体的名称后,可以匹配到某个日志,注意:输入的名称需与中括号及中括号内的内容完全匹配,“下一步”按钮才能被点亮,否则无法进入下一步,后半部分日期部分可以不用输入

③ 配置索引

选择一个时间字段,如果日志数据中本身没有,可以使用@timestamp

④ 进入日志面板

左上角菜单-Kibana-Discover,进入Kibana日志面板

五、Kibana日志面板使用

左上角菜单--Kibana--Discover,日志面板中:

  • 可以切换索引来查看不同服务的日志
  • 可以根据时间段筛选日志
  • 可以自定义日志列表字段
  • 可以通过Kibana特有的KSQL检索日志

1.定制列表字段

默认的日志中有大量字段信息是冗余的,可以通过左侧添加message字段来进行过滤

2.KSQL语句筛选

如我想接口请求路径中的关键字、筛选接口信息,那么可以通过message关键字来进行筛选,输出message后,KSQL会自动联想

语法:

  • 冒号表示 等于
  • 冒号+星号表示任意匹配
  • and表示两个参数必须同时满足
  • or表示一个或多个参数满足一个即可

例如:我想筛选指定时间段内的冒烟测试执行的相关接口日志,那么就可以通过【message: * 冒烟测试】来进行筛选

六、小结

  • ELK是一套完整的日志收集、展示解决方案,由ElasticSearch、Logstash 和 Kibana三个单词首字母拼接而成。其中:Logstash负责将日志进行过滤、收集,再传输到Elasticsearch上;Elasticsearch负责把日志作为索引进行存储并且构造对应倒排索引;Kibana负责可视化呈现日志,需要查询时Kibana调用Elasticsearch进行日志数据的查询;
  • ELK+Filebeat可用于Springboot及微服务日志的监控,Filebeat部署在需要采集日志的各个服务器上,负责监听指定log文件;
  • Kibana日志面板创建索引后能够监控和分析指定服务的指定日志文件;
  • Linux常用命令是一切服务部署的基础,本次用到的命令有:cp(复制)、tar(解压文件)、chown(改变文件属组)、chmod(更改文件权限)、vim命令(插入模式、命令模式、末行模式之间的来回切换,快捷操作)、nohup(不挂起运行);


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
7月前
|
Prometheus 监控 Cloud Native
基于docker搭建监控系统&日志收集
Prometheus 是一款由 SoundCloud 开发的开源监控报警系统及时序数据库(TSDB),支持多维数据模型和灵活查询语言,适用于大规模集群监控。它通过 HTTP 拉取数据,支持服务发现、多种图表展示(如 Grafana),并可结合 Loki 实现日志聚合。本文介绍其架构、部署及与 Docker 集成的监控方案。
671 122
基于docker搭建监控系统&日志收集
|
7月前
|
消息中间件 Java Kafka
搭建ELK日志收集,保姆级教程
本文介绍了分布式日志采集的背景及ELK与Kafka的整合应用。传统多服务器环境下,日志查询效率低下,因此需要集中化日志管理。ELK(Elasticsearch、Logstash、Kibana)应运而生,但单独使用ELK在性能上存在瓶颈,故结合Kafka实现高效的日志采集与处理。文章还详细讲解了基于Docker Compose构建ELK+Kafka环境的方法、验证步骤,以及如何在Spring Boot项目中整合ELK+Kafka,并通过Logback配置实现日志的采集与展示。
1203 64
搭建ELK日志收集,保姆级教程
|
7月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
660 1
日志收集和Spring 微服务监控的最佳实践
|
7月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
208 4
|
12月前
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
733 89
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
657 51
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
564 7
数据采集监控与告警:错误重试、日志分析与自动化运维
|
网络安全
window系统下安装elk
本文介绍了Elasticsearch、Logstash和Kibana(统称ELK栈)8.17.3版本的安装与配置流程。主要内容包括: - **Elasticsearch**:详细描述了从下载到启动服务的步骤,以及`elasticsearch.yml`的关键配置项,并提供了Postman操作示例及常见问题解决方案。 - **Logstash**:涵盖了插件安装、配置文件`logstash.conf`编写及其启动命令。 - **Kibana**:讲解了下载、配置`kibana.yml`和启动过程,确保与Elasticsearch正确连接。
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
321 3
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
SAE(Serverless应用引擎)是阿里云推出的全托管PaaS平台,致力于简化微服务应用开发与管理。为满足用户对可观测性和运维能力的更高需求,SAE引入Sidecar容器技术,实现日志采集、监控指标收集等功能扩展,且无需修改主应用代码。通过共享资源模式和独立资源模式,SAE平衡了资源灵活性与隔离性。同时,提供全链路运维能力,确保应用稳定性。未来,SAE将持续优化,支持更多场景,助力用户高效用云。
下一篇
开通oss服务