ELK 实现日志检索

article/2025/11/9 15:12:35

什么是 ELK?

ELK 并不是一个技术框架的名称,它其实是一个三位一体的技术名词,ELK 的每个字母都来自一个技术组件,它们分别是 Elasticsearch(简称 ES)、Logstash 和 Kibana。取这三个组件各自的首字母,就组成了所谓的 ELK。 

在 Elastic 解决方案中,Logstash 扮演了一个日志收集器的角色。它可以从多个数据源对数据进行采集,也可以对数据做初步过滤和清洗,比如将数据转换成通用格式、隐匿敏感数据等。

而 Elasticsearch 呢,它是一个分布式的搜索和数据分析引擎。它在整套方案中扮演了日志存储和分词器的角色。Elasticsearch 会收到来自 Logstash 的日志信息,并将这些日志信息集中存储起来。同时,Elasticserch 还对外提供了多种 RESTful 风格的接口,上层应用可以通过这些接口完成数据查找和分析的任务。

Kibana 在整个 Elastic 方案中扮演了一个“花瓶”的角色。它提供了一套 UI 界面,让我们可以对 Elasticsearch 中存储的数据进行查找。同时,它还提供了各种统计报表的功能,如柱状图、饼图、时序统计分析、图谱关联分析等等。当然了,报表数据都来自于 Elasticsearch。 

下载 ELK 镜像 


docker pull sebp/elk:7.16.1

在这里我要重点提醒你两个点。 

第一,一定要记得尽可能多给 Docker 容器分配一些内存。否则,Elasticsearch 很容易启动失败,要知道 ES 可是一个非常吃内存的组件。我本地为 Docker 分配的运行期内存是 10G(顶配 Mac 就是豪横),我推荐你为 Docker 分配不低于 5G 的内存。

第二,低配电脑可以降低 ELK 镜像版本。如果你的电脑配置比较吃紧,无法分配高内存,那么你可以尝试获取更低版本的 ELK 组件,因为版本越高对系统的资源要求越高。你可以在Docker Hub网站上查看 sebp/elk 镜像的版本信息,再选择适合自己电脑配置的进行下载。 

创建 ELK 容器 

你可以在命令行使用如下命令创建并启动一个 ELK 容器,在这段命令中,我为 Elasticsearch、Logstash 和 Kibana 指定的启动端口分别为 9200、5044 和 5601。命令中的–name elk 参数指定了新创建的 Container 的名称为“elk”,当然了,这里你可以更换成自己喜欢的名称。 


sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

 你可以在浏览器中访问“localhost:9200”来验证 ES 是否成功被启动,正常情况下,你应该能在浏览器中看到 ES 集群的版本号等信息,这就说明 ES 启动成功了。

而 Kibana 的启动时间会更长一些,你可以在浏览器中访问“localhost:5601”来访问 Kibana 的网页。

如果启动过程中出现异常,你可以从启动日志中找到异常原因。首先你需要执行下面的命令,进入到 Container 内部。然后,使用 cd 命令进入到 /var/log 文件夹,在这里你可以找到 ES、Logstash 和 Kibana 的启动日志,查看具体的报错。

 


docker exec -it elk /bin/bash

 配置 Logstash

我们使用 docker exec 命令进入到 elk 容器之后,需要使用编辑器打开 /etc/logstash/conf.d/02-beats-input.conf 文件,它是用来配置 Logstash 的输入输出源的文件。你可以使用 vi 命令或者 vim 命令进入文件编辑模式,接下来你需要将文件中的内容替换为以下配置项。


input {tcp {port => 5044codec => json_lines}
}output {elasticsearch {hosts => ["localhost:9200"]index => "geekbang"}
}

在上面的文件中,我指定 Logstash 使用 TCP 插件作为数据输入源,并从 5044 端口收集数据,格式为 JSON,你可以通过这个链接访问 TCP 插件的完整参数列表。

同时,我还通过 output 参数将处理过后的日志数据输出到了 ES 组件中,这里我配置了 ES 的地址和数据索引,你可以点击这里的链接获取 ES 插件的详细信息。修改完成之后记得一定要保存文件。L

ogstash 支持多种类型的输入和输出源,你可以结合自己的项目架构,选择适合的数据源。如果你对这部分内容感兴趣,可以分别参考以下的两个配置文档:

Logstash Input 插件列表

Logstash Output 插件列表

接下来,你还需要在容器外部执行下面这行命令,通过重启 ELK 容器,让 Logstash 重新加载最新的配置项。 


docker restart elk

对接 ELK 容器 

首先,你需要为三个微服务项目添加 logstash-logback-encoder 依赖项,它提供了对接 Logstash 的日志输出组件,这里我使用了 7.0.1 的稳定版本。 


<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.0.1</version>
</dependency>

 接下来,你需要在每个项目的 src/main/resources 路径下创建 logback-spring.xml 组件,在这个文件中,我们定义了两个 Appender 用来输出日志信息。

第一个是 ConsoleAppender,它可以将日志信息打印到控制台上。这里我使用了 Spring Boot 默认的日志格式。


<appender name="console" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><!-- 日志输出编码 --><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder>
</appender>

第二个是 LogstashTcpSocketAppender,由于我们在 ELK 容器中指定了使用 TCP 的方式接收日志信息,所以这个 Appender 对象专门用来构建 JSON 格式化数据发送到 Logstash。在下面的代码中,你可以看到我将日志的主体信息,以及 Span、Trace 等链路追踪信息作为了 JSON 数据的一部分。 


<appender name="logstash"class="net.logstash.logback.appender.LogstashTcpSocketAppender"><!-- 这是Logstash的连接方式 --><destination>127.0.0.1:5044</destination><!-- 日志输出的JSON格式 --><encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>UTC</timeZone></timestamp><pattern><pattern>{"severity": "%level","service": "${applicationName:-}","trace": "%X{traceId:-}","span": "%X{spanId:-}","pid": "${PID:-}","thread": "%thread","class": "%logger{40}","rest": "%message"}</pattern></pattern></providers></encoder>
</appender>

查看 Kibana 日志信息 

当 ELK 容器处于运行状态时,你可以在浏览器中打开“localhost:5601”地址访问 Kibana 系统。不过,在使用 Kibana 做日志查询之前,你还需要添加一个 Index。这里所说的 Index 其实是 ES 中的一个查询参数。

在这节课前半部分,我在 ELK 容器的 Logstash 配置项中指定了 Index=geekbang,这个值会作为 Index 参数,Logstash 向 ES 传输日志信息的时候,会将“geekbang”写入 ES。

为了简化配置,我将所有的日志信息都归在了 geekbang 这个索引之下,当然了,你也可以在 Logstash 配置文件中通过表达式动态生成 Index 的值。 

 如果你有了一个 Trace ID 或者 Span ID,那么你可以直接在 Kibana 的 Discover 页面查询这个 ID 对应的所有详细日志信息。当然了,根据 ES 对日志的分词结果,你还可以借助 Kibana 的 KQL 表达式构造复杂查询条件,你可以访问 Kibana 的Kuery-query页面学习如何使用 KQL 查询。

 

总结

今天我们通过 ELK 镜像搭建了一套完整的日志查询系统,这个过程中的重点是配置 Logstash 的输入输出数据源。出于简化课程难度的目的,我并没有使用 filebeat 或者 kafka 之类的输入源,而是使用了 TCP Socket 方式,让业务系统直接把日志信息传输到 Logstash。

从高可用的角度出发,我们通常并不会将业务系统与 Logstash 直连,取而代之的是将日志写入本地文件,然后通过 Filebeat 之类的工具收集本地 log 文件,并传输给 Logstash。

这样做的好处是,无论 Logstash 和应用服务器之间的连接通路是否顺畅,日志文件都会落盘保存,并不会因网络异常而丢失。另一方面,Filebeat 使用了一种“背压敏感协议”技术,用来应对海量数据访问的压力,它会根据 Logstash 的处理速率调整文件读取速度,如果 Logstash 正忙,Filebeat 就会降低读取文件的速度。


http://chatgpt.dhexx.cn/article/BXqpZImO.shtml

相关文章

Elo评分算法原理与实现

《社交网络》里的Mark Zackburg被女朋友甩后,在舍友的启发下,充分发挥了技术宅男自娱自乐的恶搞天分,做出了Facemash网站,对学校女生的相貌进行排名打分,结果网站访问流量过大,直接把学校网络搞瘫痪了。Facemask大受欢迎的关键就在于Zackburg基友Eduardo写在窗户上的排名…

ELO评分算法

ELO等级分制度是由匈牙利裔美国物理学家Elo创建的一个衡量各类对弈活动选手水平的评分方法&#xff0c;是当今对弈水平评估的公认的权威方法。被广泛应用于国际象棋、围棋、足球等运动&#xff0c;以及很多网游与电子竞技产业。游戏界比较著名的应用有&#xff1a; WOW&#xf…

ELMo算法介绍

这篇介绍一下ELMo算法(论文)。按道理应该加入前面的《关于句子embedding的一些工作简介》系列&#xff0c;但是严格来讲&#xff0c;只能说它通过自己产生的word embedding来影响了句子embedding, 所以干脆另写一篇吧。 IntroductionBidirectional language modelsELMoEvaluati…

ELO算法的JAVA实现

近期接手一个游戏项目&#xff0c;由于项目涉及得分计算&#xff0c;故研究了下ELO算法。关于ELO算法的程序实现&#xff0c;是少之又少&#xff0c;好不容易看到了一篇&#xff0c;最终不得不关闭该页面&#xff0c;故决定自己实现。 1. ELO算法数学实现介绍 其中表达式各字母…

数值 ELO算法教程

ELO是什么&#xff1f; 是指由匈牙利裔美国物理学家阿帕德埃洛创建的一个衡量各类对弈活动水平的评价方法&#xff0c;是当今对弈水平评估的公认的权威方法。被广泛用于国际象棋、围棋、足球、篮球等运动。 埃洛排名系统是基于统计学的一个评估棋手水平的方法。美国国际象棋协…

使用WaveOut API播放WAV音频文件(解决卡顿)

虽然waveout已经过时&#xff0c;但是其api简单&#xff0c;有些时候也还是需要用到。 其实还是自己上msdn查阅相应api最靠谱&#xff0c;waveout也有提供暂停、设置音量等接口的&#xff0c;这里给个链接&#xff0c;需要的可以自己查找&#xff1a; https://msdn.microsoft.c…

使用WaveIn录制音频并且使用WaveOut播放音频

在Windows下开发音频的方式有多种&#xff0c;但是最简单&#xff0c;也是最灵活的就是Wave系列API&#xff0c;今天我们一起用WaveIn和WaveOut实现一个音频录制和音频播放器&#xff0c;具体界面如下&#xff1a; 录制步骤如下&#xff1a; void CcbdDlg::OnBnClickedButtonS…

WaveOut播放声音死锁问题原因

1.首先我们复习下造成死锁的几个充要条件&#xff1a; 1&#xff09;互斥&#xff1a;互斥资源&#xff0c;只能被一个进程使用 2&#xff09;不剥夺&#xff1a;非抢占式调度&#xff0c;不能强行抢用其他进程资源 3&#xff09;请求和保持&#xff1a;占有着资源不释放&am…

C++ 使用waveOut实现声音播放

文章目录 前言一、需要的对象及方法1.对象2.方法 二、整体流程三、关键实现1.声音格式2.对象池 四、封装成对象1.接口设计2.具体实现 五、使用示例总结 前言 在Windows上实现声音播放比较简单的方法是使用winmm&#xff0c;其中的waveOut模块就可以打开声音设备&#xff0c;播…

windows下使用waveOut播放音频pcm

目录 一、前言 二、waveOut主要API介绍 三、waveOut播放PCM音频框架 《Windows平台使用waveOut播放PCM数据代码实现》链接&#xff1a; https://edu.csdn.net/learn/38258/606147?spm1003.2001.3001.4157 一、前言 在<windows下directShow音视频采集>一篇文章中就介…

双缓冲方法实现waveOut的连续无卡顿播放以及即收即放

1. waveOut基本使用方法 waveOut是一套历史悠久的Windows音频API&#xff0c;虽然古老&#xff0c;但至今仍运行良好&#xff0c;且支持老旧系统&#xff08;原生支持Windows XP&#xff09;。 waveOut虽然不像DirectSound那样自带混音功能&#xff0c;但也可以通过同时开多个…

清华牛逼!

如果让你用尽可能多的词语形容一名女子的美貌&#xff0c;你会怎么说&#xff1f; “这女孩太美了&#xff0c;闭月羞花、沉鱼落雁不足以形容起美貌。那身段令貂婵蒙羞&#xff0c;那脸蛋令月亮失色。那眼睛&#xff0c;那鼻子&#xff0c;那小嘴&#xff0c;那胸脯&#xff0c…

博士申请 | 上海交通大学叶南阳老师招收计算机视觉/机器学习方向博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 上海交通大学 上海交通大学约翰霍普克罗夫特计算机科学中心于 2017 年 1 月正式成立&#x…

硬核实力!西安交大人工智能学科到底有多强?

人工智能 是时下最火的科技词汇之一 人工智能 作为引领未来的战略性技术 正默默改变着人类的生产生活 西安交大人工智能研究是国内高校的先驱 拥有强大的学术实力 科研成绩斐然 斩获国内外多项荣誉 今天 跟着小编一起走进交大人工智能 漫步科学殿堂 西安交通大学人工智能学科发…

清华大学交叉信息研究院姚班修改培养模式:姚班、智班、量信班全合并

机器之心报道 编辑&#xff1a;杜伟、泽南 拓宽优秀学生的选择方向。 清华大学交叉信息研究院宣布了优化本科培养模式的新计划&#xff1a; 为进一步拓宽学生基础学养&#xff0c;并优化专业方向选择&#xff0c;特调整本科生培养模式&#xff0c;具体要点如下&#xff1a; 1、…

我的2020推免之路:清叉、TBSI、贵系、中山、国防科大、自动化所

我的2020推免之路&#xff1a;清叉、TBSI、贵系、中山、国防科大、自动化所 一.前言二.个人情况三.夏令营清华大学交叉信息学院&#xff08;6.13~6.14&#xff09;清华-伯克利深圳学院&#xff08;7.2~7.9&#xff09;清华大学计算机系&#xff08;7.8~7.9&#xff09;中山大学…

清北浙交大比拼,南大强势上榜,AI到底哪家强?

作者 | 阿司匹林 编者注&#xff1a;近日&#xff0c;上海交通大学和武书连编制的两份比较有影响力的大学排行榜先后发布。这两份榜单的最终排名虽然存在一定的差异&#xff0c;但是都将清华大学、北京大学、浙江大学、上海交通大学、以及复旦大学排在了前五&#xff08;先后顺…

2022 ACM杰出会员揭榜:清华黄隆波、刘世霞,北大郝丹、刘譞哲等23位华人学者入选!...

来源&#xff1a;新智元 2022年度ACM杰出会员&#xff08;Distinguished Member&#xff09;名单公布&#xff01; 本次评选设有三个奖项&#xff0c;分别表彰在计算机领域做出的教育贡献、工程贡献和科学贡献。 今年共有67名会员入选。其中有23位是华人&#xff08;中国大陆6人…

科研实习 | 清华大学交叉信息研究院弋力老师课题组招收科研实习生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 清华大学 弋力博士于2021年7月加入清华大学交叉信息研究院任助理教授&#xff0c;博士生导师…

数说CS | 北大叉院推免生源大起底!

写在前面 北京大学前沿交叉学科研究院是怎样的一个存在&#xff1f;研究方向与其他学院有什么不同&#xff1f;学术氛围如何&#xff1f; 今天&#xff0c;岛主将会带领各位一同了解北大叉院&#xff0c;从学院介绍、培养特色、优营生源分析等板块为大家深入剖析&#xff01;…