ELK踩坑记
liuian 2025-05-23 18:31 83 浏览
#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系统
<pre> 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</pre>
通过 -v 参数将ELK所需配置文件,数据目录投递到容器
P.S. 如果要启用安全功能,使用一键运行的elk就不太方便调试了,可以参考 [[DOCKER环境下ELK部署及安全设定]]这篇文章拉取Elastic官方docker镜像进行安装。
注:这篇文章不是 Step by Step 的教程文章,有些遗漏的地方,因此也只适合相关从业者参考。
问题十、Elastic 返回指定字段
<pre>curl http://url/index/_search?q=abc&_source=fieldA,fieldB,fieldC_search?q=keyword&filter_path=hits.hits._source&_source=fields_spec其中:filter_path为只返回指定路径</pre>
问题十一、关于ILM(索引生命周期管理)
顾名思义,索引生成周期管理是针对Elastic Search 索引的,主要功能是两项:数据的冷、温、热分离;数据的保存期限设置。注意:ILM的相关策略是在索引上生效,而不能在索引模板以及索引模式上生效。
索引模板主要用于控制索引在**创建时**的一些行为:主要作用有两项目,一是应用ILM策略,二是应用一些字段转化规则,比如某个字段转化为数字,某个字段进行分词诸如此类。索引模板只针对后面新建的索引生效。
索引模式用于概括名称符合一定规则的索引,比如在Kibana的Discover以及DASHBOARD中,需要创建索引模式,以告诉Kibana应该在哪些索引中搜索数据,在前述索引模板中,也需要创建索引模式以告诉Elastic哪些索引在创建时要套用模板中的规则。
在索引模板设置中引用ILM策略:
<pre>{ "index": { "lifecycle": { "name": "store-30d" } }}</pre>
问题十二、使用LOGSTASH自动创建索引时,自动生成的字段类型不匹配导致部分日志入库失败
在 logstash output 相关配置中指定 index 相关配置项后,如果相关索引不存在,系统会自动创建相关索引,而索引字段类型是通过首次推送的数据推断而来的,因此,如果LOGSTASH 系统从多个数据源获取日志时,可能导致部分日志的部分字段类型不统一,从而导致部分日志无法入库。解决办法:
在索引模板中约束相关字段的类型,而拒绝ES在创建索引时自动推断字段类型。在Kibana里面,通过 Management/Index Management/Index Templates/ 创建相关的索引模板,并在MAPPINGS 选项中,为容易出现问题的字段添加类型(最好为Text,这样兼容性更强一点),这样,系统在创建索引时,会自动以模板中的类型替代自动推断。
注:关于索引模板的相关使用,可以查看 **问题11** 中相关说明。
相关推荐
- 教你把多个视频合并成一个视频的方法
-
一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...
- 零代码编程:用kimichat合并一个文件夹下的多个文件
-
一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...
- Java APT_java APT 生成代码
-
JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...
- Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器
-
在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...
- 挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?
-
如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...
- 五年后,谷歌还在全力以赴发展 Kotlin
-
作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...
- kotlin和java开发哪个好,优缺点对比
-
Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...
- 移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?
-
掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...
- 颜值非常高的XShell替代工具Termora,不一样的使用体验!
-
Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...
- 预处理的底层原理和预处理编译运行异常的解决方案
-
若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...
- 为“架构”再建个模:如何用代码描述软件架构?
-
在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...
- 深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型
-
2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...
- 比分网开发技术栈与功能详解_比分网有哪些
-
一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...
- 设计模式之-生成器_一键生成设计
-
一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...
- 构建第一个 Kotlin Android 应用_kotlin简介
-
第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)