百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

ELK踩坑记(elk siem)

csdh11 2025-04-08 13:13 30 浏览

#ELK #ElasticSearch #Kibana

本文不是Step by Step教程文章,是我个人在搭建大型elk系统中遇到的一些问题,只建议相关从业者参阅。

问题一、Logstash 配置后疑似日志疑似没有向ElasticSearch推送

在使用

curl http://192.168.60.3:9200/_cat/indices?v 
注:如果es集群有用户身份认证,应该加上 -u uid:password 参数,如果启用了SSL,原则上应该再带上 -k 参数
以下同。

查看ElasticSearch中存在的索引时,发现相关的索引数据量一直没有增长,怀疑是Logstash没有往ElasticSearch推送数据。

经查为索引没刷新,可以通过

curl http://192.168.60.3:9200/_all/_flush 

刷新相关索引后重新关注数据量增长情况。发现 Logstash 在稳定推送数据。

问题二、Elastic 数据量不断增大,可能占满服务器磁盘空间

使用

curl -XDELETE http://192.168.60.3:9200/firewall-v4-2021.10.19 

形式的命令可以删除创建时间较久的索引。

注:ILM也可以实现索引的生命周期管理,具体参阅问题11

问题三、数据推送到 Elastic 后,在 Kibana 的 Discovery 与 Dashboard 界面无法看到相关索引

7.15.1 版本 Kibana,需要在
Manage/Kibana/IndexPattern 下添加数据索引模式。之后可以在 Analytics/Discover 以及
Analytics/Dashboard/CreateVisualization 调用索引模式

问题四、关于KQL指令

多条件连接: and, or

在指定字段中搜索: fieldname: search-pattern

举例:以下指令搜索device字段包含4J-3,Action字段为Permit的文档数据: device: 4J-3 and Action: Permit

注:在elastic search中,分词可能会有一定规则,比如某条日志中包含以下文本:10NAT/6/NAT_FLOW,那么要检索出该条日志,使用NAT这一关键字可能无法准确选取出该日志,应该该日志可能按照斜杆分词,却可能不会按照下划线分词,因此:你使用10NAT, NAT_FLOW 可以检索,单纯使用NAT作为关键字却无法检出该日志。另外,在KQL中可以在关键字首尾使用*通配符号。而多个关键字用空格分隔时,其关系为 或

问题五、ETL的系统架构模式

Logstash: 收取并清洗日志,向Elastic推送日志,其中,需要在Logstash配置文件中的 output 节设置相关的推送参数。

Elastic: 需要设置一系列参数

- 如 sysctl -w vm.max_map_count=262144 增大系统资源,调增docker的CPU及内存数量(如果有限制的话)

- 系统启动后,如果Elastic为单机模式,需要设置以下参数:1)设置副本数量为0,否则系统上所有索引会显示为Yellow状态。相关命令:

curl -XPUT "http://192.168.60.3:9200/_settings" -d "{\"number_of_replicas\":0}" -H "content-type:application/json"

Kibana: 需要设置ElasticSearch节点或者集群相关信息。配置:kibana.yml 文件

问题六、ELK时间戳问题

在 logastash 与 ElasticSearch 中,时间戳所在的时区均为UTC时区,而在Kibana默认使用用户浏览器时区,也就是说:

- Logastash 在生成日志时间戳时,无论你服务器所在的时区是什么,它均为转换为UTC时区。如日志默认的 "@timestamp" 时间戳。

- ElasticSearch 如果收到的时间戳类型的数据如果没带时区,其会直接转换为距离1970年1月1日0时0分的毫秒数存储到数据库中,如果带了时区,其会转换为UTC后,再按照距离1970年1月1日的毫秒数存储到数据库中,也就是说,如果我们在Logstash中对时间戳进行了处理,比如增加了8个小时,并保存在"cstts"这个字段中,这条日志传输到Elastic后,由于没带时区,cstts 这个字段的时间戳不会被修改,但到Kibana后,系统会按照你浏览器的时区对时间戳进行调整,也就是说:你没有做处理的"@timestamp"时间戳反而是对的,经处理的cstts这个时间戳反而快了8个小时。因此,在纯粹的ELK系统中,无须对时间戳做特别处理,由系统内部处理,时间就是会是正常的。

我个人的实践是在LOGSTASH特定增加两个字段,用于保存UTC及CST时间戳,以便ES及本地保存时无视日志中包含的时间戳,这样虽然存储日志的时间可能与日志事件发生的时间有所不同,但能够确保文件在保存时的时间保持一致性。使用Ruby处理,相关代码

filter{  mutate{  }  ruby{
    code => "      event.set('utc', Time.now.getutc)      event.set('cst', Time.now.getutc + 8*60*60)      cst = Time.now.getutc + 8*60*60      pathstr = cst.strftime('%Y-%m-%d/%H')      indexstr = cst.strftime('%Y-%m-%d')      event.set('pathstr',pathstr)      event.set('indexstr',indexstr)    "  }
  date{    match => ["timestamp","MMM d HH:mm:ss", "MMM d HH:mm:ss YYYY", "ISO8601"]  }}

其中:pathstr为格式化的本地日期+小时,indexstr为本地化的日期,主要为了保持在ES与LS本地存储日志时间的统一性。在output节中相关代码如下:

output{  elasticsearch{    hosts => ["es1:9200"]    index => "raw-%{indexstr}"    ssl => true    cacert => "/usr/share/logstash/config/cert/elastic-stack-ca.pem"    user => "elastic"    password => "xxxxx"  }}

问题七、在Kibana的Dashboard中,索引模板的部分字段为空字段。

这个具体原因还没有找到,依据系统相关文档的解释,貌似如果索引中的前500个文档中未在该字段找到足够数据包含该字段的话,该字段就会被标记为空字段。但我在实测中,实际上每个字段都存在相关数据,但有的字段被标记为空字段。空字段无法在dashboard中引用及画图

问题八、Kibana Web端不停报警安全功能未启用:Warning299

有两种方法处理该问题,一是在Elastic的相关配置:elasticsearch.yml 中显示关闭xpack安全功能,二是对Elastic启用安全功能,如开启用户名和密码认证,SSL传输等。

方法一:在 ElasticSearch 配置文件:elasticsearch.yml 中添加如下指令:

x-pack.security.enabled = false ,并重启Elasic集群。不过需要注意确认Elastic启动时所用的配置文件,可能不是elasticsearch/config/下的配置文件,可通过: pe -ef | grep elastic 的命令行参数确认。

问题九、通过docker启动ELK系统

 docker run -tid -p 5601:5601 -p 5044:5044 -p 9200:9200 -p 9300:9300 \    -v /root/data/es/conf/kibana.yml:/opt/kibana/config/kibana.yml \    -v /root/data/es/data:/var/lib/elasticsearch \    -v /root/data/logstash/config:/opt/logstash/config \    --restart=always --name elk sebp/elk

通过 -v 参数将ELK所需配置文件,数据目录投递到容器

P.S. 如果要启用安全功能,使用一键运行的elk就不太方便调试了,可以参考 [[DOCKER环境下ELK部署及安全设定]]这篇文章拉取Elastic官方docker镜像进行安装。

注:这篇文章不是 Step by Step 的教程文章,有些遗漏的地方,因此也只适合相关从业者参考。

问题十、Elastic 返回指定字段

curl http://url/index/_search?q=abc&_source=fieldA,fieldB,fieldC_search?q=keyword&filter_path=hits.hits._source&_source=fields_spec其中:filter_path为只返回指定路径


问题十一、关于ILM(索引生命周期管理)

顾名思义,索引生成周期管理是针对Elastic Search 索引的,主要功能是两项:数据的冷、温、热分离;数据的保存期限设置。注意:ILM的相关策略是在索引上生效,而不能在索引模板以及索引模式上生效。

索引模板主要用于控制索引在**创建时**的一些行为:主要作用有两项目,一是应用ILM策略,二是应用一些字段转化规则,比如某个字段转化为数字,某个字段进行分词诸如此类。索引模板只针对后面新建的索引生效。

索引模式用于概括名称符合一定规则的索引,比如在Kibana的Discover以及DASHBOARD中,需要创建索引模式,以告诉Kibana应该在哪些索引中搜索数据,在前述索引模板中,也需要创建索引模式以告诉Elastic哪些索引在创建时要套用模板中的规则。

在索引模板设置中引用ILM策略:

{  "index": {    "lifecycle": {      "name": "store-30d"    }  }}


问题十二、使用LOGSTASH自动创建索引时,自动生成的字段类型不匹配导致部分日志入库失败

在 logstash output 相关配置中指定 index 相关配置项后,如果相关索引不存在,系统会自动创建相关索引,而索引字段类型是通过首次推送的数据推断而来的,因此,如果LOGSTASH 系统从多个数据源获取日志时,可能导致部分日志的部分字段类型不统一,从而导致部分日志无法入库。解决办法:

索引模板中约束相关字段的类型,而拒绝ES在创建索引时自动推断字段类型。在Kibana里面,通过 Management/Index Management/Index Templates/ 创建相关的索引模板,并在MAPPINGS 选项中,为容易出现问题的字段添加类型(最好为Text,这样兼容性更强一点),这样,系统在创建索引时,会自动以模板中的类型替代自动推断。

注:关于索引模板的相关使用,可以查看 **问题11** 中相关说明。

相关推荐

Github霸榜的SpringBoot全套学习教程,从入门到实战,内容超详细

前言...

SpringBoot+LayUI后台管理系统开发脚手架

源码获取方式:关注,转发之后私信回复【源码】即可免费获取到!项目简介本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础...

探秘Spring Cache:让Java应用飞起来的秘密武器

探秘SpringCache:让Java应用飞起来的秘密武器在当今快节奏的软件开发环境中,性能优化显得尤为重要。SpringCache作为Spring框架的一部分,为我们提供了强大的缓存管理能力,让...

3,从零开始搭建SSHM开发框架(集成Spring MVC)

目录本专题博客已共享在(这个可能会更新的稍微一些)https://code.csdn.net/yangwei19680827/maven_sshm_blog...

Spring Boot中如何使用缓存?超简单

SpringBoot中的缓存可以减少从数据库重复获取数据或执行昂贵计算的需要,从而显著提高应用程序的性能。SpringBoot提供了与各种缓存提供程序的集成,您可以在应用程序中轻松配置和使用缓...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

1,从零开始搭建SSHM开发框架(环境准备)

目录本专题博客已共享在https://code.csdn.net/yangwei19680827/maven_sshm_blog1,从零开始搭建SSHM开发框架(环境准备)...

做一个适合二次开发的低代码平台,把程序员从curd中解脱出来-1

干程序员也有好长时间了,大多数时间都是在做curd。现在想做一个通用的curd平台直接将我们解放出来;把核心放在业务处理中。用过代码生成器,在数据表设计好之后使用它就可以生成需要的controller...

设计一个高性能Java Web框架(java做网站的框架)

设计一个高性能JavaWeb框架在当今互联网高速发展的时代,构建高性能的JavaWeb框架对于提升用户体验至关重要。本文将从多个角度探讨如何设计这样一个框架,让我们一起进入这段充满挑战和乐趣的旅程...

【推荐】强&牛!一款开源免费的功能强大的代码生成器系统!

今天,给大家推荐一个代码生成器系统项目,这个项目目前收获了5.3KStar,个人觉得不错,值得拿出来和大家分享下。这是我目前见过最好的代码生成器系统项目。功能完整,代码结构清晰。...

Java面试题及答案总结(2025版持续更新)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试场景题及答案。...

Java开发网站架构演变过程-从单体应用到微服务架构详解

Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构、集群架构、分布式架构、SOA架构和微服务架构。下面玄武老师来给大家详细介绍下这5种架构模式的发展背景、各自优缺点以及涉及到的...

本地缓存GuavaCache(一)(guava本地缓存原理)

在并发量、吞吐量越来越大的情况下往往是离不开缓存的,使用缓存能减轻数据库的压力,临时存储数据。根据不同的场景选择不同的缓存,分布式缓存有Redis,Memcached、Tair、EVCache、Aer...