【商城实战(97)】ELK日志管理系统的全面应用

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。

目录

  • [一、ELK 日志管理系统概述](#一、ELK 日志管理系统概述)
  • [二、搭建 ELK 日志管理系统](#二、搭建 ELK 日志管理系统)
    • [2.1 安装 Elasticsearch](#2.1 安装 Elasticsearch)
    • [2.2 安装 Logstash](#2.2 安装 Logstash)
    • [2.3 安装 Kibana](#2.3 安装 Kibana)
  • [三、配置 Logstash 收集商城系统日志](#三、配置 Logstash 收集商城系统日志)
    • [3.1 配置 Logstash 输入](#3.1 配置 Logstash 输入)
    • [3.2 配置 Logstash 过滤](#3.2 配置 Logstash 过滤)
    • [3.3 配置 Logstash 输出](#3.3 配置 Logstash 输出)
  • [四、日志传输至 Elasticsearch 存储](#四、日志传输至 Elasticsearch 存储)
    • [4.1 启动 Logstash](#4.1 启动 Logstash)
    • [4.2 验证日志存储](#4.2 验证日志存储)
  • [五、使用 Kibana 进行日志查询与分析](#五、使用 Kibana 进行日志查询与分析)
    • [5.1 配置 Kibana 索引模式](#5.1 配置 Kibana 索引模式)
    • [5.2 基本日志查询](#5.2 基本日志查询)
    • [5.3 高级日志分析](#5.3 高级日志分析)
  • [六、案例实战:利用 ELK 解决商城系统故障](#六、案例实战:利用 ELK 解决商城系统故障)
    • [6.1 故障场景描述](#6.1 故障场景描述)
    • [6.2 使用 ELK 排查故障](#6.2 使用 ELK 排查故障)
    • [6.3 故障解决与总结](#6.3 故障解决与总结)
  • 七、总结与展望

一、ELK 日志管理系统概述

在商城系统的开发与运维过程中,日志管理是至关重要的一环。ELK 日志管理系统作为一套强大的开源解决方案,由 Elasticsearch、Logstash 和 Kibana 三个核心组件构成,为商城系统的日志处理提供了全方位的支持。

Elasticsearch 是一个分布式的搜索引擎,具备强大的存储和检索能力。它能够高效地存储海量的日志数据,并通过其分布式架构实现高可用性和扩展性。无论是在数据量较小的初创商城,还是拥有庞大用户群体和复杂业务逻辑的大型电商平台,Elasticsearch 都能稳定地提供快速的数据检索服务,确保在需要时能够迅速定位到关键日志信息。

Logstash 则是一个数据处理管道,负责收集、过滤和转换日志数据。在商城系统中,各种不同来源的日志,如前端的用户操作日志、后端的业务逻辑执行日志、数据库的操作日志等,都可以通过 Logstash 进行统一收集。它支持多种输入插件,能够从文件、系统日志、网络端口等不同数据源获取日志,并且可以利用丰富的过滤器插件对日志进行处理,例如解析日志格式、提取关键信息、添加自定义字段等,然后将处理后的日志输出到 Elasticsearch 中进行存储。

Kibana 为用户提供了一个直观的 Web 界面,用于可视化和分析存储在 Elasticsearch 中的日志数据。通过 Kibana,开发人员和运维人员可以方便地创建各种图表、仪表盘,对日志数据进行深入分析,从而快速发现系统中的潜在问题,如性能瓶颈、错误频发的模块等。它还支持灵活的查询语法,能够根据不同的条件对日志进行精确检索,大大提高了故障排查和系统优化的效率。

对于商城系统而言,ELK 日志管理系统的重要性不言而喻。随着商城业务的不断发展,系统产生的日志量也会迅速增长,传统的日志管理方式难以满足对日志进行高效分析和利用的需求。ELK 系统能够将分散在各个服务器和组件中的日志集中管理,实现日志的统一存储、检索和分析,为商城系统的稳定运行、性能优化、安全监控等提供有力支持。在用户投诉某个功能无法正常使用时,运维人员可以通过 ELK 系统快速查询相关时间段内的用户操作日志和后端服务日志,定位问题所在;开发人员也可以利用日志分析结果对系统进行优化,提升用户体验。

二、搭建 ELK 日志管理系统

2.1 安装 Elasticsearch

  1. 下载 :首先,从 Elasticsearch 官方网站(https://www.elastic.co/downloads/elasticsearch)下载适合你服务器操作系统的安装包。例如,对于 Linux 系统,下载.tar.gz格式的安装包。假设下载的安装包名为elasticsearch-7.17.0-linux-x86_64.tar.gz。
  2. 解压:使用以下命令解压安装包到指定目录,这里我们解压到/usr/local/目录下:
typescript 复制代码
tar -zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz -C /usr/local/

解压后,Elasticsearch 的文件将位于/usr/local/elasticsearch-7.17.0/目录中。

  1. 配置:进入 Elasticsearch 的配置目录/usr/local/elasticsearch-7.17.0/config/,编辑elasticsearch.yml文件。
typescript 复制代码
cd /usr/local/elasticsearch-7.17.0/config/
vim elasticsearch.yml

在elasticsearch.yml文件中,进行如下配置:

typescript 复制代码
# 集群名称,同一集群内的节点需使用相同的集群名称
cluster.name: mall - elk - cluster
# 节点名称,每个节点需有唯一的名称,这里假设为node - 1
node.name: node - 1
# 绑定IP地址,0.0.0.0表示允许所有IP访问
network.host: 0.0.0.0
# HTTP端口,默认9200
http.port: 9200
# 集群初始主节点列表,在单节点情况下可以不配置,多节点时需配置
# cluster.initial_master_nodes: ["node-1"]
  1. 启动:完成配置后,切换到 Elasticsearch 的安装目录/usr/local/elasticsearch-7.17.0/,使用以下命令启动 Elasticsearch:
typescript 复制代码
./bin/elasticsearch

启动过程中,Elasticsearch 会输出一些日志信息。如果启动成功,你将看到类似如下的输出:

typescript 复制代码
[2024 - 12 - 10T10:10:10,100][INFO ][o.e.n.Node               ] [node - 1] started

此时,Elasticsearch 已经在http://localhost:9200启动并运行,你可以通过浏览器访问http://localhost:9200来验证是否安装成功。如果看到类似如下的 JSON 响应,表示安装成功:

typescript 复制代码
{
  "name" : "node-1",
  "cluster_name" : "mall - elk - cluster",
  "cluster_uuid" : "abcdefghijklmnopqrstuvwxyz",
  "version" : {
    "number" : "7.17.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "abcdef1234567890abcdef1234567890abcdef12",
    "build_date" : "2024 - 12 - 01T00:00:00.000Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0 - beta1"
  },
  "tagline" : "You Know, for Search"
}

2.2 安装 Logstash

  1. 下载 :从 Logstash 官方网站(https://www.elastic.co/downloads/logstash)下载与 Elasticsearch 版本匹配的安装包。同样,对于 Linux 系统,下载.tar.gz格式的安装包,假设下载的安装包名为logstash-7.17.0.tar.gz。
  2. 解压:使用以下命令解压安装包到指定目录,例如/usr/local/:
typescript 复制代码
tar -zxvf logstash-7.17.0.tar.gz -C /usr/local/

解压后,Logstash 的文件将位于/usr/local/logstash-7.17.0/目录中。

  1. 配置:进入 Logstash 的配置目录/usr/local/logstash-7.17.0/config/,创建一个新的配置文件,例如mall_logstash.conf,用于收集商城系统的日志。
typescript 复制代码
cd /usr/local/logstash-7.17.0/config/
vim mall_logstash.conf

在mall_logstash.conf文件中,配置输入、输出和过滤条件,以适应商城系统日志收集。假设商城系统的日志文件位于/var/log/mall/目录下,日志格式为 JSON,以下是一个简单的配置示例:

typescript 复制代码
input {
    file {
        path => "/var/log/mall/*.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
        codec => json
    }
}
filter {
    # 这里可以添加更多的过滤条件,例如解析日志中的特定字段
    mutate {
        add_field => { "service" => "mall - system" }
    }
}
output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "mall - logs - %{+YYYY.MM.dd}"
    }
    stdout {
        codec => json_lines
    }
}

上述配置中:

  • input部分定义了从/var/log/mall/目录下的所有日志文件中读取日志,从文件开头开始读取,并且不使用sincedb记录读取位置(因为日志文件可能会不断更新),使用json编解码器解析日志。
  • filter部分使用mutate过滤器添加了一个service字段,值为mall - system,方便后续对日志进行分类和查询。
  • output部分将处理后的日志输出到 Elasticsearch 中,索引名为mall - logs - 日期,同时也输出到标准输出,方便调试。

2.3 安装 Kibana

  1. 下载 :从 Kibana 官方网站(https://www.elastic.co/downloads/kibana)下载与 Elasticsearch 和 Logstash 版本匹配的安装包。对于 Linux 系统,下载.tar.gz格式的安装包,假设下载的安装包名为kibana-7.17.0-linux-x86_64.tar.gz。
  2. 解压:使用以下命令解压安装包到指定目录,如/usr/local/:
typescript 复制代码
tar -zxvf kibana-7.17.0-linux-x86_64.tar.gz -C /usr/local/

解压后,Kibana 的文件将位于/usr/local/kibana-7.17.0/目录中。

  1. 配置:进入 Kibana 的配置目录/usr/local/kibana-7.17.0/config/,编辑kibana.yml文件。
typescript 复制代码
cd /usr/local/kibana-7.17.0/config/
vim kibana.yml

在kibana.yml文件中,进行如下配置:

typescript 复制代码
# Kibana服务端口,默认5601
server.port: 5601
# Kibana服务绑定的主机地址,0.0.0.0表示允许所有IP访问
server.host: "0.0.0.0"
# Kibana实例名称
server.name: "mall - kibana"
# Elasticsearch的URL地址
elasticsearch.hosts: ["http://localhost:9200"]
# Kibana使用的索引,用于存储保存的搜索、可视化和仪表板
kibana.index: ".kibana"
  1. 启动:完成配置后,切换到 Kibana 的安装目录/usr/local/kibana-7.17.0/,使用以下命令启动 Kibana:
typescript 复制代码
./bin/kibana

启动过程中,Kibana 会输出一些日志信息。如果启动成功,你可以通过浏览器访问http://localhost:5601,看到 Kibana 的登录界面,表示 Kibana 安装成功。

三、配置 Logstash 收集商城系统日志

3.1 配置 Logstash 输入

在 Logstash 的配置文件mall_logstash.conf中,输入部分用于指定从何处收集日志。以 Spring Boot 后端为例,假设商城系统的日志文件位于/var/log/mall/springboot/目录下,日志文件名为mall - springboot.log,且日志格式为 JSON,配置如下:

typescript 复制代码
input {
    file {
        path => "/var/log/mall/springboot/mall - springboot.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
        codec => json
    }
}

解释:

  • path:指定日志文件的路径。
  • start_position:设置为beginning表示从文件开头开始读取日志。如果设置为end,则只读取新添加到文件末尾的日志。
  • sincedb_path:用于记录文件读取位置的数据库路径。设置为/dev/null表示不使用该数据库,每次都从文件开头读取(适用于日志文件不断更新且需要全量读取的情况)。
  • codec:指定日志的编解码器为json,表示日志文件中的每一行都是 JSON 格式的数据。

3.2 配置 Logstash 过滤

Logstash 的过滤器用于对收集到的日志进行处理和转换,使其更易于分析和存储。以下是一些常见的过滤器配置示例:

  1. 使用 grok 插件解析日志格式:如果日志不是 JSON 格式,而是自定义的文本格式,可以使用 grok 插件通过正则表达式解析日志。假设 Spring Boot 的日志格式如下:
typescript 复制代码
2024 - 12 - 10 10:10:10 INFO [http - nio - 8080 - exec - 1] com.example.mall.controller.UserController: getUsers - 查询用户列表

配置 grok 过滤器如下:

typescript 复制代码
filter {
    grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:log_time} %{LOGLEVEL:log_level} \[%{DATA:thread_name}\] %{JAVACLASS:class_name}: %{DATA:method_name} - %{GREEDYDATA:log_message}" }
    }
}

解释:

  • match:定义匹配规则,message表示日志的内容字段,后面的正则表达式将日志内容解析为不同的字段。
  • TIMESTAMP_ISO8601:匹配 ISO8601 格式的时间戳,并将其存储在log_time字段中。
  • LOGLEVEL:匹配日志级别,存储在log_level字段中。
  • DATA:匹配任意数据,thread_name、class_name、method_name、log_message分别用于存储线程名、类名、方法名和日志消息。
  1. 使用 mutate 插件修改字段类型、删除或重命名字段:例如,将log_time字段的类型转换为日期类型,并删除thread_name字段,同时重命名class_name为package_name:
typescript 复制代码
filter {
    mutate {
        convert => { "log_time" => "date" }
        remove_field => ["thread_name"]
        rename => { "class_name" => "package_name" }
    }
}

解释:

  • convert:将log_time字段的值转换为日期类型。
  • remove_field:删除thread_name字段。
  • rename:将class_name字段重命名为package_name。

3.3 配置 Logstash 输出

Logstash 的输出部分用于指定将处理后的日志发送到何处。这里我们将日志输出到 Elasticsearch 中,配置如下:

typescript 复制代码
output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "mall - springboot - logs - %{+YYYY.MM.dd}"
        document_type => "_doc"
    }
    stdout {
        codec => json_lines
    }
}

解释:

  • hosts:指定 Elasticsearch 的主机地址和端口,这里假设 Elasticsearch 运行在本地,端口为 9200。
  • index:定义日志存储在 Elasticsearch 中的索引名称,%{+YYYY.MM.dd}表示按日期生成索引,例如mall - springboot - logs - 2024.12.10。
  • document_type:指定文档类型,这里设置为_doc(Elasticsearch 7.x 及以上版本默认使用_doc)。
  • stdout:用于调试,将日志以 JSON 格式输出到标准输出,方便查看处理后的日志内容 。

四、日志传输至 Elasticsearch 存储

4.1 启动 Logstash

在完成 Logstash 的配置后,需要启动 Logstash 使其开始收集和传输商城系统的日志。启动 Logstash 的命令如下:

typescript 复制代码
cd /usr/local/logstash-7.17.0/
./bin/logstash -f config/mall_logstash.conf

上述命令中,cd /usr/local/logstash-7.17.0/用于切换到 Logstash 的安装目录,./bin/logstash表示执行 Logstash 程序,-f参数用于指定配置文件的路径,这里是config/mall_logstash.conf。

注意事项:

  • 指定配置文件路径:确保-f参数后面的配置文件路径正确无误,否则 Logstash 将无法读取配置,导致启动失败。如果配置文件不在默认的config目录下,需要指定完整的路径。
  • 检查配置文件是否正确:在启动 Logstash 之前,可以先使用--config.test_and_exit参数来验证配置文件的语法是否正确。例如:
typescript 复制代码
./bin/logstash -f config/mall_logstash.conf --config.test_and_exit

如果配置文件存在语法错误,Logstash 会输出错误信息,指出错误的位置和原因。此时需要根据错误提示修改配置文件,直到验证通过为止。

  • 权限问题:确保执行启动命令的用户对 Logstash 的安装目录和配置文件具有足够的权限。如果权限不足,可能会导致无法读取配置文件或无法启动 Logstash。
  • 端口冲突:Logstash 在运行过程中可能会使用一些端口,例如与 Elasticsearch 通信的端口。确保这些端口没有被其他进程占用,否则 Logstash 将无法正常连接到 Elasticsearch。如果出现端口冲突,可以修改 Logstash 的配置或停止占用端口的其他进程。

4.2 验证日志存储

在启动 Logstash 并将商城系统日志传输至 Elasticsearch 后,需要验证日志是否成功存储。可以通过以下两种方式进行验证:

  1. 使用 Elasticsearch 的 API 查询:可以使用curl命令调用 Elasticsearch 的搜索 API 来查询存储的日志。例如,查询索引mall - springboot - logs - 2024.12.10中的所有日志:
typescript 复制代码
curl -XGET "http://localhost:9200/mall - springboot - logs - 2024.12.10/_search?pretty"

上述命令中,-XGET表示使用 GET 请求方法,http://localhost:9200/mall - springboot - logs - 2024.12.10/_search是 Elasticsearch 的搜索 API 地址,?pretty参数用于格式化输出结果,使其更易于阅读。如果日志成功存储,将返回包含日志数据的 JSON 响应。

  1. 使用 Kibana 的 Dev Tools 进行查询:打开 Kibana 的 Web 界面(http://localhost:5601),进入 Dev Tools 页面。在 Dev Tools 中,可以使用 Elasticsearch 的 DSL(Domain - Specific Language)语法进行查询。例如,查询索引mall - springboot - logs - 2024.12.10中log_level为ERROR的日志:
typescript 复制代码
GET /mall - springboot - logs - 2024.12.10/_search
{
    "query": {
        "match": {
            "log_level": "ERROR"
        }
    }
}

点击 "Execute" 按钮执行查询,Kibana 将返回符合条件的日志数据。通过这种方式,可以更直观地查看和分析存储在 Elasticsearch 中的日志。

五、使用 Kibana 进行日志查询与分析

5.1 配置 Kibana 索引模式

在 Kibana 中,索引模式是查询和分析日志数据的基础,它定义了 Kibana 如何访问 Elasticsearch 中的索引。以下是配置 Kibana 索引模式的具体操作步骤:

  1. 打开 Kibana 界面:在浏览器中访问 Kibana 的地址,例如http://localhost:5601,进入 Kibana 的登录界面。输入正确的用户名和密码后,进入 Kibana 的主界面。
  2. 进入索引模式设置页面:在 Kibana 主界面的左侧菜单栏中,点击 "Management"(管理)选项,展开管理菜单。在管理菜单中,点击 "Index Patterns"(索引模式),进入索引模式设置页面。
  3. 创建新的索引模式:在索引模式设置页面中,点击 "Create index pattern"(创建索引模式)按钮。在弹出的 "Create index pattern" 对话框中,输入要匹配的索引名称或通配符表达式。由于我们之前配置 Logstash 将商城系统日志输出到以mall - springboot - logs - %{+YYYY.MM.dd}格式命名的索引中,因此在这里输入mall - springboot - logs - *,表示匹配所有以mall - springboot - logs -开头的索引。然后点击 "Next step"(下一步)按钮。
  4. 配置时间字段:在接下来的页面中,需要选择一个时间字段,用于对日志进行时间相关的查询和分析。通常,日志中会包含一个表示时间的字段,如@timestamp。在 "Time Filter field name"(时间过滤器字段名称)下拉列表中,选择@timestamp字段。如果日志中没有@timestamp字段,可以在 Logstash 配置中添加或修改相应的过滤器来生成该字段。选择完时间字段后,点击 "Create index pattern"(创建索引模式)按钮,完成索引模式的创建。

此时,返回索引模式设置页面,可以看到刚刚创建的索引模式mall - springboot - logs - *已经显示在列表中。点击该索引模式,可以查看其详细信息,包括匹配的索引、时间字段等。配置好索引模式后,就可以在 Kibana 的其他功能中使用该索引模式来查询和分析商城系统的日志数据了 。

5.2 基本日志查询

在 Kibana 的 Discover 界面中,可以进行基本的日志查询操作,帮助我们快速定位和查看感兴趣的日志信息。以下是基本日志查询的方法:

  1. 进入 Discover 界面:在 Kibana 主界面的左侧菜单栏中,点击 "Discover"(发现)选项,进入 Discover 界面。在 Discover 界面中,会显示已配置索引模式下的日志数据。
  2. 时间范围筛选:在 Discover 界面的顶部,有一个时间选择器,用于筛选日志的时间范围。默认情况下,时间范围可能是最近 15 分钟。可以点击时间选择器,选择不同的预设时间范围,如 "Last 1 hour"(过去 1 小时)、"Today"(今天)、"This week"(本周)等。也可以点击 "Custom range"(自定义范围),手动输入开始时间和结束时间,精确筛选日志。例如,将时间范围设置为 "Last 1 hour",表示只查看过去 1 小时内的日志数据。
  3. 输入查询关键字:在 Discover 界面的搜索框中,可以输入查询关键字,用于在日志中进行搜索。查询关键字可以是日志中的任意内容,如某个类名、方法名、错误信息、用户 ID 等。例如,输入 "UserController",表示查询包含 "UserController" 的日志。Kibana 支持使用简单的查询语法,如使用 "AND"、"OR"、"NOT" 等逻辑运算符连接多个关键字,进行更复杂的查询。例如,输入 "UserController AND error",表示查询包含 "UserController" 且包含 "error" 的日志。
  4. 查看查询结果:输入查询关键字并选择时间范围后,点击搜索框右侧的搜索按钮,Kibana 会根据查询条件在日志中进行搜索,并在下方的日志列表中显示匹配的日志结果。日志列表中会显示每条日志的基本信息,如时间、日志级别、日志内容等。点击某条日志,可以展开查看其详细信息,包括更多的字段和上下文信息。

例如,在商城系统中,如果用户反馈某个用户相关的功能出现问题,我们可以在 Discover 界面中进行如下查询:将时间范围设置为用户反馈问题的大致时间范围,如过去 30 分钟;在搜索框中输入 "UserController AND getUsers",表示查询在过去 30 分钟内,UserController中执行getUsers方法相关的日志。通过查看查询结果,我们可以了解该方法的执行情况,是否出现错误等信息,从而帮助我们定位问题。

5.3 高级日志分析

Kibana 不仅提供了基本的日志查询功能,还具备强大的可视化功能,能够帮助我们进行高级日志分析,发现商城系统中的潜在问题。以下是使用 Kibana 可视化功能进行高级日志分析的方法:

  1. 创建柱状图:柱状图可以用于比较不同类别或时间段的数据量。例如,我们想要分析商城系统中不同模块的日志数量分布情况。在 Kibana 主界面的左侧菜单栏中,点击 "Visualize"(可视化)选项,进入可视化创建页面。点击 "Create a visualization"(创建可视化)按钮,在弹出的可视化类型选择框中,选择 "Vertical bar chart"(垂直柱状图)。在 "Choose a search"(选择搜索)页面中,选择之前配置好的商城系统日志索引模式,如mall - springboot - logs - *,然后点击 "Create"(创建)按钮。在柱状图配置页面中,设置 "Bucket"(桶)为 "Terms"(术语),在 "Field"(字段)下拉列表中选择表示模块的字段,如package_name(假设在 Logstash 过滤中提取了该字段);设置 "Metric"(指标)为 "Count"(计数),表示统计每个模块的日志数量。点击 "Apply changes"(应用更改)按钮,即可生成不同模块日志数量的柱状图。从柱状图中,可以直观地看出哪些模块产生的日志数量较多,哪些模块较少,从而判断系统中哪些模块可能存在较多的活动或潜在问题。
  2. 创建折线图:折线图常用于展示数据随时间的变化趋势。比如,我们想了解商城系统在一天内不同时间段的错误日志数量变化情况。在可视化创建页面中,选择 "Line chart"(折线图)。同样选择商城系统日志索引模式,然后创建折线图。在折线图配置页面中,设置 "Bucket" 为 "Date histogram"(日期直方图),在 "Field" 中选择@timestamp字段,设置 "Interval"(时间间隔)为 "Auto"(自动)或具体的时间间隔,如 "1 hour"(1 小时);设置 "Metric" 为 "Count",并在 "Filter"(过滤器)中添加条件,过滤出日志级别为 "ERROR" 的日志。点击 "Apply changes" 按钮,即可生成错误日志数量随时间变化的折线图。通过观察折线图,可以发现错误日志数量在哪些时间段出现峰值,从而进一步分析这些时间段系统可能发生的情况,如高并发访问导致的错误增加等。
  3. 创建饼图:饼图适合展示各部分占整体的比例关系。假设我们要分析商城系统中不同类型请求的占比情况。在可视化创建页面中,选择 "Pie chart"(饼图)。选择日志索引模式后创建饼图。在饼图配置页面中,设置 "Bucket" 为 "Terms",在 "Field" 中选择表示请求类型的字段,如request_type(假设日志中记录了该字段);设置 "Metric" 为 "Count"。点击 "Apply changes" 按钮,生成不同类型请求占比的饼图。从饼图中,可以清晰地看到各种请求类型在总请求中的占比,帮助我们了解系统的业务流量分布情况。

通过使用这些可视化分析,我们可以从不同角度深入了解商城系统的运行状况,发现潜在的性能瓶颈、错误趋势等问题,为系统的优化和改进提供有力依据。

六、案例实战:利用 ELK 解决商城系统故障

6.1 故障场景描述

在商城系统的日常运营中,突然有大量用户反馈下单失败。用户在点击下单按钮后,页面长时间加载,随后弹出提示 "下单失败,请稍后重试"。初步判断,可能是由于系统高并发导致数据库连接池耗尽,或者是下单接口出现了代码逻辑错误,亦或是网络波动影响了请求的正常传输。这一故障严重影响了用户体验和商城的业务交易,急需快速定位并解决。

6.2 使用 ELK 排查故障

  1. 时间范围确定:首先,登录 Kibana 的 Discover 界面,根据用户反馈的时间,将时间范围设置为故障发生前后的一个小时,例如从 "2024-12-10 14:00:00" 到 "2024-12-10 15:00:00",确保能够涵盖所有与故障相关的日志信息。
  2. 关键字查询:在搜索框中输入 "order" 和 "fail" 作为查询关键字,因为 "order" 与订单相关,"fail" 表示失败,这样可以快速筛选出与订单失败相关的日志。Kibana 迅速返回了大量匹配的日志记录,其中许多日志都包含 "order service error" 的信息,这表明订单服务可能出现了问题。
  3. 查看详细日志:点击其中一条日志进行详细查看,发现日志中包含如下信息:
typescript 复制代码
{
    "@timestamp": "2024-12-10T14:20:10.123Z",
    "log_level": "ERROR",
    "message": "order service error: java.sql.SQLException: Connection pool is exhausted",
    "package_name": "com.example.mall.service.impl.OrderServiceImpl",
    "method_name": "createOrder"
}

从这条日志中可以看出,错误信息为 "Connection pool is exhausted",即连接池耗尽。这意味着数据库连接池中的连接已经全部被占用,无法为新的下单请求提供连接,从而导致下单失败。

  1. 进一步分析:为了确定连接池耗尽的原因,在 Kibana 中使用聚合功能,按照 "package_name" 和 "method_name" 进行分组统计,查看在故障时间段内各个方法的调用次数和错误次数。发现com.example.mall.service.impl.OrderServiceImpl中的createOrder方法调用次数在短时间内急剧增加,远远超过了正常水平,很可能是由于高并发请求导致连接池资源耗尽。

6.3 故障解决与总结

  1. 解决措施:根据排查结果,开发团队采取了以下措施来解决问题。首先,临时增加数据库连接池的最大连接数,以应对高并发请求。在 Spring Boot 的配置文件application.yml中,修改连接池的配置参数:
typescript 复制代码
spring:
  datasource:
    hikari:
      maximum - pool - size: 100 # 将最大连接数从默认的10增加到100

修改完成后,重新部署商城系统,确保新的配置生效。同时,对订单服务进行优化,增加限流措施,防止短时间内大量请求涌入导致系统资源耗尽。使用 Spring Cloud Alibaba 的 Sentinel 组件,对createOrder方法进行限流配置,例如设置每秒最多允许 100 个请求访问该方法。

  1. 验证故障解决:在采取解决措施后,通过 ELK 监控系统持续观察日志。在 Kibana 的 Discover 界面中,再次查询订单相关的日志,发现 "order service error: java.sql.SQLException: Connection pool is exhausted" 的错误日志不再出现,并且订单下单成功的日志数量逐渐恢复正常。同时,通过在商城系统中进行实际下单测试,多次下单均成功,验证了故障已得到解决。
  2. 经验教训总结:通过这次故障排查,深刻认识到 ELK 在商城系统运维中的重要作用。它能够帮助我们快速定位故障原因,节省大量的排查时间。在未来的系统开发和运维中,需要进一步完善系统的监控和预警机制,及时发现潜在的性能问题。例如,设置连接池使用率的预警阈值,当连接池使用率超过 80% 时,通过邮件或短信通知运维人员,以便提前采取措施进行优化。同时,在系统设计阶段,要充分考虑高并发情况下的性能问题,合理设置各种资源的参数,避免类似故障再次发生。

七、总结与展望

通过本次在商城系统中应用 ELK 日志管理系统,我们取得了显著的成果。从搭建 ELK 系统到配置 Logstash 收集商城系统日志,并将其传输至 Elasticsearch 存储,再到使用 Kibana 进行日志查询与分析,整个过程构建了一个高效、强大的日志管理体系。

在实际应用中,ELK 日志管理系统大大提升了商城系统的日志管理效率。以往,面对分散在各个服务器和组件中的海量日志,查找和分析特定信息犹如大海捞针,耗费大量的时间和精力。而现在,通过 ELK 系统的集中管理和高效检索功能,能够快速定位到所需的日志,极大地节省了时间成本。在故障排查方面,ELK 系统更是发挥了关键作用。当商城系统出现故障时,借助 Kibana 的强大查询和可视化功能,能够迅速从日志中找出问题的根源,如系统报错的具体时间、相关的业务模块、错误信息等,为及时解决故障提供了有力支持。通过对日志数据的深入分析,还可以发现系统中的潜在性能瓶颈,从而针对性地进行优化,提升系统的整体性能和用户体验。

展望未来,我们可以进一步探索 ELK 的高级功能,以更好地服务于商城系统的发展。在日志聚合方面,可以通过更合理的配置和优化,实现对不同来源、不同格式日志的更高效聚合,减少数据冗余,提高数据的可用性。通过设置更精确的日志聚合规则,按照业务模块、用户行为等维度对日志进行聚合,以便更深入地分析系统的运行状况。在实时告警方面,可以结合 ELK 和其他告警工具,实现对商城系统关键指标和异常情况的实时监控和告警。当系统出现高并发、错误率飙升等异常情况时,能够及时发送告警信息,通知运维人员和开发人员采取相应的措施,避免问题的扩大化。可以配置 ELK 与短信告警服务集成,当特定错误日志出现一定次数时,自动发送短信通知相关人员。还可以考虑将 ELK 与机器学习算法相结合,实现对日志数据的智能分析和预测,提前发现潜在的问题,为商城系统的稳定运行和持续发展保驾护航。

相关推荐
奔跑吧邓邓子3 天前
【商城实战(92)】高并发下的商城缓存进阶:从原理到实战
redis·缓存·springboot·uniapp·element plus·商城实战
奔跑吧邓邓子4 天前
【商城实战(74)】数据采集与整理,夯实电商运营基石
springboot·uniapp·element plus·商城实战·商城数据采集与整理
yunqi12154 天前
【监控系列】ELK
elk
北枫寒夜5 天前
简单ELK框架搭建
elk
奔跑吧邓邓子8 天前
【商城实战(61)】搜索提示与自动完成功能全解析
商城实战·搜索提示·搜索自动完成
奔跑吧邓邓子12 天前
【商城实战(51)】从uniapp商城到PC端的华丽转身:适配与优化全攻略
uni-app·商城实战·pc端适配
DS_Watson12 天前
docker 部署elk 设置账号密码
linux·elk·docker
奔跑吧邓邓子13 天前
【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
uniapp·小程序优化·商城实战·小程序适配
落魄实习生14 天前
ELK(Elasticsearch、Logstash、Kbana)安装及Spring应用
spring·elk·elasticsearch