了解 ELK 实时日志平台的工作原理,并练习如何构建和使用它。
在排查在线异常的过程中,查询日志始终是不可或缺的一部分。 如今,大多数微服务架构都使用,日志分散在不同的机器上,这使得查询日志变得极其困难。 要想做好工作,首先要磨刀。如果这个时候有一个统一的实时日志分析平台,可以说是雪地里的碳交割,这肯定会提高我们在线排查的效率。 本文将为您介绍开源实时日志分析平台ELK的构建与使用。
ELK 是一个开源的实时日志分析平台,由Elasticsearch、Logstash和Kiabana三部分组成。
Logstash 主要用于收集服务器日志,是一个具有实时流水线功能的开源数据收集引擎。 Logstash 动态统一来自不同数据源的数据,并将数据规范化到您选择的目标。
从 Logstash 收集数据的过程主要分为三个部分:
输入:数据(包括但不限于日志)通常以不同的形式和格式存储在不同的系统中,LogStash 允许您从各种数据源(文件、系统日志、mysql、消息中间件等)收集数据。 过滤器:实时解析和转换数据,识别命名字段以构建结构,并将其转换为通用格式。 输出:Elasticsearch 并不是存储的唯一选项,Logstash 提供了许多输出选项。 Elasticsearch (ES) 是一个分布式的 RESTful 搜索和数据分析引擎,具有以下特点:
查询:允许您执行和组合多种类型的搜索(结构化搜索、非结构化搜索、地理搜索、指标搜索),并更改搜索方式。 分析:借助 Elasticsearch 聚合,您可以全面了解数据并探索趋势和模式。 速度:非常快,可以实现上亿级数据,毫秒级的回报。 可扩展性:在笔记本电脑或数百或数千台托管 PB 级数据的服务器上运行。 弹性:在分布式环境中运行,在设计时考虑到了这一点。 灵活性:多种用例。 欢迎数字、文本、地理、结构化、非结构化,欢迎所有数据类型。 Kibana 使海量数据易于理解。 它很简单,具有基于浏览器的界面,可让您快速创建和共享动态数据仪表板,以跟踪 Elasticsearch 中的实时数据变化。 此外,它也易于设置,因此您可以在几分钟内安装 Kibana 并开始探索 Elasticsearch 的索引数据,而无需额外的基础设施。
以上三个组件在《ELK协议栈介绍与架构》一文中都有详细描述,这里不再赘述。 在 ELK 中,三个组件的大致工作流程如下图所示,Logstash 从每个服务收集日志并将其存储在 Elasticsearch 中,然后 Kiabana 从 Elasticsearch 查询日志并将其展示给最终用户。
图1ELK 的近似工作流程
通常我们的服务部署在不同的服务器上,所以如何从多个服务器收集日志信息是一个关键点。 本文中提供的解决方案如下图所示:
图2本文提供了一个 ELK 实现
如上图所示,整个 ELK 运行如下:
在微服务(生成日志的服务)上部署一个 logstash,作为 shipper 角色,主要负责从机器上服务生成的日志文件中采集数据,并将消息推送到 Redis 消息队列。 此外,服务器还部署了 Indexer 角色的 Logstash 角色,主要负责从 Redis 消息队列中读取数据,在 Logstash 流水线中对其进行解析和处理,然后输出到 Elasticsearch 集群进行存储。 Elasticsearch主备节点之间的数据同步。 在单台服务器上部署 Kibana,从 Elasticsearch 读取日志数据并显示在网页上。 通过这张图,我相信你对我们将要构建的 ELK 平台的工作流程以及所需的组件有一个大致的了解。 让我们一起开始构建它。
本节介绍如何使用 Indexer 角色构建 ELK 日志平台,包括 Logstash、Elasticsearch 和 Kibana。 要完成此部分,您需要执行以下操作:
作为教程,Ubuntu 机器或虚拟机省略了 Elasticsearch 集群的设置,而是在同一台机器上安装 Logstash(Indexer)、Elasticsearch 和 Kibana。 在 Ubuntu 上安装 JDK,请注意 Logstash 要求 JDK 在 1对于 7 或更高版本,有关如何在 Ubuntu 上安装 JDK 的详细信息,请参阅“在 Ubuntu 上安装 JDK1”。8“ 这段文字。 Logstash、Elasticsearch、Kibana 安装包,您可以在此页面找到它们**。 解压缩 zip 包:
tar -xzvf logstash-7.3.0.tar.gz
一个简单的用例测试转到解压缩目录,并启动一个管道,将控制台输入和输出放入控制台。
cd logstash-7.3.0elk@elk:~/elk/logstash-7.3.0$ bin/logstash -e 'input }output }'
看到以下日志表示 logstash 已成功启动。
图3logstash 启动成功日志。
在控制台中输入hello logstash
,以下效果表示 LogStash 安装成功。
清单 1验证 logstash 是否成功启动
hello logstash
解压安装包:
tar -xzvf elasticsearch-7.3.0-linux-x86_64.tar.gz
启动 Elasticsearch:
cd elasticsearch-7.3.0 bin elasticsearch 显示更多显示更多 icon在启动 elasticsearch 的过程中,我遇到了两个问题,这里列出来是为了方便排查。 问题一:内存太小,如果你的机器内存小于Elasticsearch设置的值,就会报错如下图所示。 解决方法是修改 elasticsearch-73.0/config/jvm.选项文件中的以下配置适合您机器的内存大小,如果修改后仍然报告此错误,您可以重新连接到服务器并重试。 图4内存太小,导致 Elasticsearch 启动错误**!图4内存太小,导致 Elasticsearch 启动错误**!/ibm_articles_img/build-elk-and-use-it-for-springboot-and-nginx_images_image004.png)**问题 2** 如果以 root 用户身份启动,将报告如下图所示的错误。解决方案当然是添加一个新用户来启动 Elasticsearch,在线添加新用户的方法有很多种,这里就不赘述了。 图5root 用户在启动 Elasticsearch 时出现错误**!图5root 用户在启动 Elasticsearch 时出现错误**!/ibm_articles_img/build-elk-and-use-it-for-springboot-and-nginx_images_image005.png)
我在启动 Elasticsearch 的过程中遇到了两个问题,为了方便故障排除,我将在这里列出它们。
问题一:如果机器内存小于Elasticsearch设置的值,则报错如下图所示。 解决方案是,修改elasticsearch-7.3.0/config/jvm.options
文件中的以下配置适合您机器的内存大小,如果修改后仍报此错误,可以重新连接到服务器重试。
图4内存太小,导致 Elasticsearch 启动错误**!
问题二,如果您正在使用root
如果用户启动它,它将报告如下图所示的错误。 解决方案当然是添加一个新用户来启动 Elasticsearch,在线添加新用户的方法有很多种,这里就不赘述了。
图5root 用户在启动 Elasticsearch 时出现错误**!
启动成功后,将设置另一个会话窗口以执行curl http://localhost:9200
命令,如果出现如下结果,则表示Elasticsearch安装成功。
清单 2检查Elasticsearch是否成功启动
elk@elk:~$curl http://localhost:9200,"tagline" : "you know, for search"}
解压安装包:
tar -xzvf kibana-7.3.0-linux-x86_64.tar.gz
修改配置文件config/kibana.yml
,它指定了有关 Elasticsearch 的信息。
清单 3Kibana 配置信息
Elasticsearch主机地址:elasticsearchhosts: "http://ip:9200"允许远程访问服务器host: "0.0.0.0"Elasticsearch 用户名 这其实是我在服务器上启动 elasticsearch 时用的用户名username: "es"Elasticsearch 认证密码 这其实是我在服务器上启动 Elasticsearch 时用的密码password: "es"
启动 Kibana:
cd kibana-7.3.0-linux-x86_64/bin./kibana
在浏览器中访问http://ip:5601
如果出现以下屏幕,则表示Kibana安装成功。
图6Kibana 发布成功屏幕
ELK 日志平台安装完成后,我们将通过具体示例来了解如何使用 ELK,下面将介绍如何将 Spring Boot 日志和 NGINX 日志交给 ELK 进行分析。
首先我们需要创建一个Spring Boot项目,我写了一篇关于如何使用AOP统一处理Spring Boot web日志的文章,本文中的Spring Boot项目就是基于这篇文章,源码可以在这里获取。 在项目中resources
目录spring-logback.xml
配置 文件。
清单 4Spring Boot 项目 logback 的配置
logback for demo mobile ..d [%thread] %5level %logger $ msg%n ..
上面省略了很多,你可以在源代码中得到它。 在上面的配置中,我们定义了一个名为rolling_file
之appender
以指定格式输出日志文件。 以及以上pattern
标签是特定日志格式的配置,通过上面的配置,我们指定了时间、线程、日志级别、记录器(通常是打印日志的类的完整路径)等信息的输出,以及服务的名称。
打包项目并将其部署到 ubuntu 服务器。
清单 5打包和部署 Spring Boot 项目
打包命令 mvn package -dm**entest.skip=true 部署命令 j**a -jar sb-elk-start-00.1-snapshot.jar
查看日志文件logback
在配置文件中,我将日志存储在/log/sb-log.log
文件, 执行more /log/sb-log.log
命令,则表示部署成功。
图7Spring Boot 日志文件
Spring Boot 项目部署成功后,我们还需要在当前部署的机器上为shipper 角色安装和配置 Logstash。 Logstash 的安装过程已经在 ELK 平台设置部分进行了介绍,因此我不会在这里详细介绍。 安装完成后,我们需要为 Logstash 编写一个配置文件,以支持从日志文件中收集日志并输出到 Redis 消息管道中,如 shipper 的配置所示。
清单 6为托运人角色配置 logstash
input }output }
其实 logstash 的配置对应上面提到的 logstash 流水线的三个部分(输入、过滤、输出),但是这里我们不需要过滤,所以我们就不写了。 上述配置中输入使用的数据源为文件类型,只需配置需要采集的原生日志文件路径即可。 输出描述了如何导出数据,在本例中,数据被配置为输出到 REDIS。
Redis (英语)data_type
可用值为channel
跟list
二。 channel
是 Redis 的发布-订阅通信模式list
是 Redis 的队列数据结构,两者都可用于实现系统之间消息的有序异步通信。 channel
比较list
这样做的好处是消除了发布者和订阅者之间的耦合。 例如,在 Redis 中持续读取记录的索引器现在想要添加第二个索引器(如果使用)list
,前一条记录由第一个索引器选取,下一条记录由第二个索引器选取,从而在两个索引器之间产生竞争,导致任何一方都不读取完整日志。 channel
这是可以避免的。 这在 shipper 角色的配置文件和下面将提到的索引器角色的配置文件中都使用channel
配置完 Shipper 角色的 Logstash 后,我们还需要配置 Indexer 角色 Logstash,支持从 Redis 接收日志数据,并通过筛选条件存储在 Elasticsearch 中,如下图所示。
清单 7索引器角色的日志存储配置
input }filter \=%ms|)"} }output elasticsearch }
与 Shipper 不同,我们在索引器管道中定义筛选器,这是将日志解析为结构化数据的地方。 这是我截取的一张截图logback
日志内容:
清单 8Spring Boot 项目输出的日志
2019-08-11 18:01:31.602 [http-nio-8080-exec-2] info c.i.s.aop.WeblogaspAspect SB-ELK - 接口日志 POST 请求测试接口结束调用:耗时 = 11ms,result=BaseResponse
在过滤器中,我们使用 grok 插件从上述日志中解析时间、线程名称、记录器、服务名称和接口时间消耗字段。 grok 是如何工作的?
message
字段是保存收集的数据的 logstash 字段match =
这意味着将处理日志内容。 Grok 实际上也通过正则表达式解析数据,如上所示timestamp_iso8601
notspace
等等都内置在 grok 中patterns
,哪些是内置在 grok 中的patterns
可以在这里查看。 我们可以使用 grok 调试器来测试解析后的字符串的正确性,避免了在真实环境中对解析规则正确性的重复验证。 完成以上步骤后,我们已经完成了整个ELK平台的搭建和Spring Boot项目的集成。 让我们按照以下步骤做一些事情,看看效果。
1. 启动 Elasticsearch,启动命令在 ELK 平台建设部分提到,这里不再赘述(Kibana 启动也是一样)。 2. 以索引器角色启动 Logstash。
进入 logstash 解压目录,执行如下命令:bin logstash -f indexer-logstashconf
3. 启动 Kibana。
4. 为托运人角色启动 Logstash。
进入logstash解压目录,执行以下命令:bin logstash -f shipper-logstashconf
5. 调用 Spring Boot 接口,此时数据应该已经写入 ES。
6. 在浏览器中访问http://ip:5601
打开 Kibana Web 界面,并添加它,如下图所示logback
指数。
图8在 Kibana 中添加 Elasticsearch 索引
7. 输入discover界面,选择logback
index,您可以看到日志数据,如下图所示。
图9ELK 日志查看
相信大家已经通过以上步骤成功搭建了自己的ELK实时日志平台,并连接了logback日志。 但是,在实际场景中,几乎不可能只有一种类型的日志,所以让我们在上述步骤的基础上访问 nginx 的日志。 当然,这一步的前提是我们需要在服务器上安装 nginx,具体安装过程在网络上有描述,这里就不赘述了。 查看nginx的日志如下(nginx的访问日志默认开启。/var/log/nginx/access.log
文件)。
清单 9nginx 的访问日志
192.168.142.1 - 17/aug/2019:21:31:43 +0800] "get /weblog/get-test?name=elk http/1.1"200 3 "" "mozilla/5.0 (windows nt 10.0; win64; x64)applewebkit/537.36 (khtml, like gecko) chrome/76.0.3809.100 safari/537.36"
同样,我们需要为此日志编写一个 grok 解析规则,如下所示:
清单 10Grok nginx 访问日志的解析规则
% \"% %http/%" % "%" "%"
毕竟,关键点是索引器类型的 logstash 需要支持两种类型的输入、筛选器和输出,但如何支持呢? 首先需要指定输入类型,然后根据不同的输入类型经过不同的过滤器和输出,如下图所示(由于篇幅原因,这里没有显示配置文件,可以在这里获取)。 清单 11索引器角色的 logstash 配置支持两种类型的日志输入
input redis }filter if [type] == "nginx" }output if [type] == "nginx" }
我的 nginx 和 Spring Boot 项目部署在同一台机器上,所以我需要修改 shipper 类型的 logstash 的配置,以支持两种类型的日志输入和输出,配置文件的内容可以在这里获取。 完成以上配置后,我们可以按照 View Effect 章节中的步骤启动 Shipper 角色的 ELK 平台、Logstash、Nginx 和 Spring Boot 项目,然后在 Kibana 上添加 Nignx 索引,同时查看 Spring Boot 和 Nginx 日志,如下图所示。 图10Elk 查看 Nginx 日志
在以上步骤中,ELK 的启动过程是将三个组件的启动命令一一执行。 而且也是在前台启动的,这意味着如果我们关闭会话窗口,组件就会停止,导致整个 ELK 平台无法使用,这在实践中是不现实的,剩下的就是如何让 ELK 在后台运行。 正如《Logstash 最佳实践》一书中所建议的那样,我们将使用主管来管理 ELK 的启动和停止。 首先,我们需要安装 supervisor 并在 ubuntu 上执行它apt-get install supervisor
能。 安装成功后,我们还需要在 supervisor 的配置文件中配置 ELK 的三个组件(其配置文件默认/etc/supervisor/supervisord.conf
文件)。清单 12麋鹿在后台启动
[program:elasticsearch]environment=j**a_home="/usr/j**a/jdk1.8.0_221/"directory=/home/elk/elk/elasticsearchuser=elkcommand=/home/elk/elk/elasticsearch/bin/elasticsearch[program:logstash]environment=j**a_home="/usr/j**a/jdk1.8.0_221/"directory=/home/elk/elk/logstashuser=elkcommand=/home/elk/elk/logstash/bin/logstash -f /home/elk/elk/logstash/indexer-logstash.conf[program:kibana]environment=ls_heap_size=5000mdirectory=/home/elk/elk/kibanauser=elkcommand=/home/elk/elk/kibana/bin/kibana
上述配置完成后,执行以下参数sudo supervisorctl reload
整个 ELK 启动已完成,默认情况下会自动启动。 当然,我们也可以使用它sudo supervisorctl start/stop [program_name]
以管理单个应用。
在本教程中,我们主要了解什么是ELK,然后通过实际操作与您一起构建ELK日志分析平台,并访问logback和nginx日志。 您可以在 GitHub 上找到源代码 ** 和 logstash 配置文件。