当前位置: 首页 > news >正文

轻量级日志管理平台Grafana Loki

文章目录

  • 轻量级日志管理平台Grafana Loki
    • 背景
    • 什么是Loki
    • 为什么使用 Grafana Loki?
    • 架构
        • Log Storage
    • Grafana
    • 部署使用
      • 基于 Docker Compose 安装 Loki
        • MinIO
      • K8s集群部署Loki采集
      • Helm 部署方式和案例
    • 参考

轻量级日志管理平台Grafana Loki

背景

在微服务以及云原生时代,由于应用部署到遍地是,为了不像传统的方式上每台应用服务器筛选日志,那么我们可以使用日志管理平台,将所有日志都采集到统一的平台,供运维和研发人员快速排查故障,进而提升效率。

在整个运维生命周期中,日志监控主要就是关注程序运行状态。日志系统是现代运维的核心。但随着系统的复杂化和分布式架构的普及,日志量呈现指数级增长。选择一个高效的日志收集和分析工具,直接影响系统的性能和维护成本。

这样的日志平台云厂商有提供,比如腾讯云的日志服务CLS,阿里云日志SLS,百度云日志服务BLS,天翼云日志服务CT-LTS,谷歌云Cloud Logging等等。

在公司的分布式环境中,存储和管理来自各种系统资源的日志是一项具有挑战性的任务。为了简化这项任务,引入了一个称为日志聚合的概念,它从各种系统资源中收集、存储、管理日志。有各种各样的日志聚合工具,其中一个工具是 Grafana Loki。

什么是Loki

官网:https://grafana.com/docs/loki/latest/

Loki是由Grafana Labs开源的一个水平可扩展、高可用性,多租户的日志聚合系统的日志聚合系统。Loki采用了分布式的架构,并且与Prometheus、Grafana密切集成,可以快速地处理大规模的日志数据。

项目受 Prometheus 启发,官方的介绍就是: Like Prometheus, but for logs ,类似于 Prometheus 的日志系统。

Grafana Loki 是一个开源的日志收集系统,其功能是收集、存储和查询日志。Grafana Loki 压缩日志并将日志存储在块中,并将它们存储在文件系统或 AWS S3 等后端存储中。

块是一个压缩文件,其中包含基于日志卷的日志条目,因此当块大小达到其大小限制时,它会将日志存储在另一个块中。每当存储一个块时,它都会为每个块创建一个索引。索引不包含日志的内容,它只包含时间戳、块的标签和块的位置。

日志的默认保留期限为24小时,最短期限为1小时,最长可延长至30天。Loki 横向扩展并具有其查询语言 LogQL。

特别适合储存 Kubernetes Pod 日志 ; 诸如 Pod 标签之类的元数据会被自动删除和编入索引。

Loki 的一大特点是它不索引日志内容,只索引标签(Labels),这大幅减少了资源消耗。
它不对原始日志进行索引,只对日志的标签进行索引,而日志通过压缩进行存储,通常是文件系统存储,所以其操作成本更低,数量级效率更高。

与其他日志记录系统不同,Loki 的构建理念是仅索引关于日志标签的元数据(就像 Prometheus 标签一样)。然后将日志数据本身压缩并以块的形式存储在对象存储中,例如 Amazon Simple Storage Service (S3) 或 Google Cloud Storage (GCS),甚至本地文件系统。

总结:相对于EFK/ELK,专为日志而生的Loki,结合Grafana生态,对于中小企业,或者说只是作为日志系统而言,我更倾向于选择Loki代替EFK/ELK

Loki
美[ˈloʊki]英[ˈləuki:]
n.【欧神】洛基
网络洛奇;邪神洛基;火神
在这里插入图片描述

可以把Loki的功能总结如下:

  • 日志收集:Loki可以接收来自不同应用程序、主机和容器的日志数据。
  • 日志存储:Loki使用可扩展的分布式存储后端存储日志数据,包括本地存储和云存储。
  • 日志查询:Loki提供了一个高效的查询语言,可以快速地搜索和过滤日志数据。
  • 日志索引:Loki使用标签索引和压缩算法对日志数据进行索引,可以大大减少存储空间和查询时间。
  • 日志警报:Loki可以根据日志数据中的条件触发警报,并将警报发送到警报通道。
    可以看到,作为一个日志处理系统,从收集、存储、查询、告警支持都是比较全面的,配合Grafana也能够比较好实现可视化,相关组件也比较简单。

为什么使用 Grafana Loki?

  1. 入门非常简单:可以使用各种客户端从任何来源发送任何格式的日志
  2. 没有采集日志格式要求:提供了更大的灵活性以及在查询时格式化的选项
  3. 轻量级:相比ELK,Loki更加轻量级,因为它不需要一个单独的Elasticsearch集群来存储和索引日志数据
  4. 高度可扩展性:Loki可以通过添加更多的Loki实例来实现水平扩展,这使得它更容易处理大量的日志数据。
  5. 与 Prometheus、Grafana 和 K8s 原生集成:可以在单个用户界面中无缝切换查询指标、日志等数据
  6. 根据日志生成告警:可以从日志行构建指标并生成告警

Loki 更适合对日志量大但查询要求相对简单的场景。特别是在 Kubernetes 环境中,Loki 的轻量和与 Prometheus 的无缝集成,让它成为了首选。

架构

Loki 的架构非常简单,主要由以下 3 个部分组成:

  • Loki:负责存储日志和处理查询。
  • Promtail:日志收集的代理,负责在各端收集日志并将其发送给 Loki 。
  • Grafana:用于日志搜索的UI 展示。

在这里插入图片描述

在 Kubernetes 中 Promtail 以 DaemonSet 方式运行在每个节点中,通过 Kubernetes API 得到日志的正确元数据,并将它们发送到 Loki。

Loki则采用了分布式架构,将日志数据存储在多个节点上,Promtail进行日志收集,可视化依赖于Grafana

Loki具有较低的硬件要求,可以在较小的硬件上运行,例如使用少量内存和CPU。可以通过添加更多的Loki实例来实现水平扩展,这使得它更容易处理大量的日志数据。

直接支持Prometheus:Loki与Prometheus深度集成,这使得在Prometheus查询中使用Loki日志数据更加容易。

在这里插入图片描述
该图显示了 Grafana Loki 如何收集、存储、查询和可视化日志。

  1. 在 Grafana Loki 中,agent 负责从文件、容器、pod、应用程序和系统日志中收集日志。
    Loki 使用日志收集代理(agent)来收集日志,如果您在 Kubernetes 中使用 Loki,代理将作为守护程序集(Daemonset)部署,因为我们需要来自集群每个可用节点的日志。
  2. Promtail 是该架构中使用的代理(agent),Promtail 收集日志,然后过滤和压缩日志以节省存储空间。
    压缩日志后,它会为日志提供一个标签并将其发送给 Loki。
  3. 从 Promtail 接收到日志之后,Loki 将每个日志存储为一个块,该块将日志消息收集在一个文件中,以节省存储空间和有效检索。
    它还为块提供标签和时间戳。每当存储块时,它都会为每个块创建一个索引,其中包含块的时间戳、标签和位置。
  4. Loki 使用 LogQL 查询语言查询日志,LogQL 允许我们根据我们选择的标签和值过滤、聚合和分析日志。
  5. 通过将 Loki 添加到 Grafana,您可以可视化查询的日志或使用 LogCLI 从 CLI 查询日志。

Promtail 是充当 Loki 的日志代理(agent)的重要组件。它的功能是从系统中收集每个日志,标记它,然后将其发送给 Loki。Loki 从本地日志文件和系统日志中收集日志。

您必须在要收集日志的每个系统中安装 Promtail,同样,如果您在 Kubernetes 上使用 Loki,则必须在每个节点中部署 Promtail 作为守护进程集(Daemonset)

Log Storage

Loki 存储日志数据,提高查询和接收日志的效率。它将日志数据压缩成块,根据时间进行组织,并为其提供标签和时间戳。然后,它以键值对格式为每个块创建一个索引,其中块时间戳和标签等。

例如,将块的索引视为一本书的索引。

Chunks 和 Index 可以存储在各种后端对象存储或文件系统中。

一旦存储了块,它就会为数据创建一个保留期,并根据保留期自动删除。

如果您使用文件系统作为存储,则块和索引的默认存储路径是 /var/lib/loki/chunks 和 /var/lib/loki/index。

Grafana

官方文档:https://grafana.org.cn/docs/loki/latest/#google_vignette
Loki 的数据查询,都是通过 Grafana,在 Grafana 中支持 loki 的数据源,通过配置 Loki 的接口地址即可

Grafana 的查询,支持 LogQL

部署使用

官方文档:https://grafana.org.cn/docs/loki/latest/get-started/
在这里插入图片描述

使用 Grafana 进行查询验证
通过http://localhost:3000,访问Grafana来查询和观察 Loki 集群的日志数据,Grafana 已经默认把 Loki 配置为数据源。

部署 Loki 有几种方式,包括使用 Docker、Kubernetes 以及 Helm Chart :

  • 使用 Docker 部署 Loki: 使用 Docker 部署 Loki 是一种简便的方式。你可以编写一个 docker-compose.yml 文件来定义 Loki 服务,并通过 docker-compose up 命令启动 Loki。
  • 使用 Kubernetes 部署 Loki: Loki 官方推荐的最佳实践为采用 DaemonSet 部署 Promtail 的方式,Promtail 是 Loki 的代理,负责收集日志并将其发送给 Loki。你可以创建相应的 Kubernetes 配置文件,定义 Loki 和 Promtail 的部署和服务。
  • 使用 Helm Chart 部署 Loki: Helm Chart 是 Kubernetes 的包管理工具,可以用来部署 Loki。首先需要添加 Loki 的 Helm 仓库,然后使用 helm install 命令安装 Loki。安装时可以指定一个 values 文件来覆盖默认配置。

基于 Docker Compose 安装 Loki

参考官方部署手册:https://grafana.com/docs/loki/latest/get-started/quick-start/

官方docker-compose快速部署架构图有下面这些组件:使用的最新版本3.1.x
在这里插入图片描述

轻量级日志管理平台Grafana Loki搭建及应用
flog :生成日志行。 flog是常见日志格式的日志生成器。
Grafana Alloy :从 flog 中刮取原木线,并通过网关将它们推送给 Loki。
网关(nginx),接收请求并根据请求的 URL 将它们重定向到适当的容器。
Loki 读取组件:运行查询前端和查询器。
Loki 写入组件:运行分发器和接收器。
Loki 后端组件:运行 Index Gateway、Compactor、Ruler、Bloom Compactor(实验性)和 Bloom Gateway(实验性)。
Minio :Loki 用它来存储索引和块。
Grafana :提供 Loki 中捕获的日志行的可视化。

上面官方采用的是读写分离以及minio存储后端,启动的组件比较多,本人调整了成单节点部署测试,想初步体验的可以使用我下面的 docker-compose.yaml 快速部署。

[推荐参考这篇文章即可]轻量级日志管理平台Grafana Loki搭建及应用
参考URL: https://cloud.tencent.com/developer/article/2448658

物理部署protmail
若你需要采集其他机器上的日志,那么你只需要安装采集组件protmail,docker版本在上面已经演示过了,下面演示使用物理部署。

MinIO

Minio就是一个开源的、自托管的分布式对象存储服务,分布式架构,可部署在本地服务器、私有云或公有云。

数据访问:基于标准的 Amazon S3 API,支持 RESTful API 访问文件,可以使用标准的 S3 客户端工具(如 aws-cli、MinIO 控制台等)与 MinIO 交互。
协议支持:支持 S3 协议,因此可以无缝集成到现有的 S3 应用和生态系统中,方便与 AWS、Azure、Google Cloud 等其他云服务互通。

K8s集群部署Loki采集

K8s集群部署Loki采集,用NFS持久存储,日志保留7天
参考URL: https://blog.csdn.net/Lilk5/article/details/140174359
如何在k8s集群中安装配置loki并使用grafana可视化管理
参考URL: https://www.cnblogs.com/wod-Y/p/17348436.html

Helm 部署方式和案例

Install Grafana Loki with Helm官方文档:https://grafana.com/docs/loki/latest/setup/install/helm/
使用 Helm 安装 Loki Stack
参考URL: https://todoit.tech/k8s/loki/

  1. 前提条件
    在开始之前,请确保您已经:

安装了 Kubernetes 集群
安装了 Helm
配置了 kubectl 连接到您的集群

  1. 添加 Grafana Helm 仓库

  2. 创建 values.yaml 自定义配置文件

  3. 安装 Loki

# 使用自定义配置安装  
helm install loki grafana/loki \-n monitoring \-f loki-values.yaml \--create-namespace  
  1. 验证安装
# 检查 Loki Pod 状态  
kubectl get pods -n monitoring -l app.kubernetes.io/name=loki  # 查看服务  
kubectl get svc -n monitoring | grep loki  
  1. 配置 Grafana 数据源(可选)
    在 Grafana 中添加 Loki 数据源:

URL: http://loki-gateway.monitoring.svc.cluster.local

参考

真香,Grafana开源Loki日志系统取代ELK?
参考URL: https://blog.csdn.net/projim_tao/article/details/129338320
Loki vs ELK:谁是日志收集的终极选择?
参考URL: https://blog.csdn.net/problc/article/details/142330846
Grafana Loki 架构详解,比 ES 成本低很多
参考URL: https://segmentfault.com/a/1190000045124031
【写的好,推荐阅读】详解轻量日志聚合系统 Loki 架构
参考URL: https://xie.infoq.cn/article/5376127f5956a99941bbb1e00
k8s集群监控cadvisor+prometheus+grafana部署
参考URL: https://blog.csdn.net/weixin_48878440/article/details/128374447
Kubernetes 日志解决方案 Grafana Loki 「Helm 部署案例」
参考URL: https://cloud.tencent.com/developer/article/2307121
基于 Docker Compose 安装 Loki
参考URL:https://blog.csdn.net/a120608yby/article/details/140660210
轻量级日志系统docker-compose搭建Loki+Grafana+Promtail,配置、部署,查询全流程
参考URL:https://tencentcloud.csdn.net/6762647af3b8a55e4e985821.html

相关文章:

轻量级日志管理平台Grafana Loki

文章目录 轻量级日志管理平台Grafana Loki背景什么是Loki为什么使用 Grafana Loki?架构Log Storage Grafana部署使用基于 Docker Compose 安装 LokiMinIO K8s集群部署Loki采集Helm 部署方式和案例 参考 轻量级日志管理平台Grafana Loki 背景 在微服务以及云原生时…...

k8s集群部署

集群结构 角色IPmaster192.168.35.135node1192.168.35.136node2192.168.35.137 部署 #需在三台主机上操作 //关闭防火墙 [rootmaster ~]# systemctl disable --now firewalld//关闭selinux [rootmaster ~]# sed -i s/enforcing/disabled/ /etc/selinux/config//关闭swap分区…...

STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动

SPI总线驱动整体上与I2C总线驱动类型,差别主要在设备树和数据传输上,由于SPI是由4根线实现主从机的通信,在设备树上配置时需要对SPI进行设置。 原理图可知,数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…...

系统基础与管理(2025更新中)

‌一、Linux 核心架构与组件‌ ‌内核架构‌ ‌核心职责‌: 管理进程生命周期、内存分配、硬件驱动交互及文件系统操作。 模块化设计支持动态加载硬件驱动(如modprobe加载内核模块),提升灵活性和扩展性。 ‌内存管理‌&#xff1a…...

Python--内置函数与推导式(下)

3. 内置函数 数学运算类 函数说明示例​abs​绝对值​abs(-10) → 10​​pow​幂运算​pow(2, 3) → 8​​sum​求和​sum([1,2,3]) → 6​​divmod​返回商和余数​divmod(10, 3) → (3, 1)​ 数据转换类 # 进制转换 print(bin(10)) # 0b1010 print(hex(255)) # 0x…...

可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫

一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...

Windows golang安装和环境配置

【1】、golang 1.19 sdk下载 https://download.csdn.net/download/notfindjob/90422529 【2】、安装 【3】、配置 GOPATH目录 【4】、LiteIDE下载安装 https://download.csdn.net/download/notfindjob/90422580 【5】、打开LiteIDE,选择查看->管理GOPATH&…...

IP-------GRE和MGRE

4.GRE和MGRE 1.应用场景 现实场景 居家工作,公司工作,分公司工作----------需要传输交换数据--------NAT---在该场景中需要两次NAT(不安全) 为了安全有两种手段-----1.物理专线---成本高 2.VPN--虚拟专用网---隧道技术--封装技…...

LabVIEW形状误差测量系统

在机械制造领域,形状与位置公差(GD&T)直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点: ​ 设备局限:机械式千分表需人工读数,精度…...

django校园互助平台~源码

博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

Vue进阶之AI智能助手项目(五)——ChatGPT的调用和开发

AI智能助手项目 前端页面Layout布局页面-viewssrc/views/chat/layout/Permission.vuesrc/views/chat/layout/sider/index.vuesrc/views/chat/layout/sider/List.vuesrc/views/chat/layout/sider/Footer.vueComponents 组件Header/index.vueMessage/index.vue前端页面 Layout布…...

Jenkins重启后Maven的Project加载失败

个人博客地址:Jenkins重启后Maven的Project加载失败 | 一张假钞的真实世界 Jenkins重启后发现Maven的项目都没有正常加载。检查Jenkins的启动日志发现以下错误信息: java.io.IOException: Unable to read /home/jenkins/.jenkins/jobs/test-maven/conf…...

【docker】docker pull拉取中不断重复下载问题,解决方案之一,磁盘空间扩容

问题类似这样 存储空间不足 如果 Docker 运行环境的磁盘空间不足,拉取的镜像可能会被自动清理,导致重复下载。可以检查磁盘使用情况: df -h docker system df如果空间不足,可以清理一些不用的容器和镜像: docker sy…...

Ubuntu指令(一)

一、终端操作指令 打开终端,有两种便捷方式: 直接点击系统中的终端按钮;使用快捷键ctrl alt T。 关闭终端,同样有多种选择: 在终端输入exit指令;使用快捷键ctrl d;直接点击终端窗口的关闭…...

nnUNet V2修改网络——加入MultiResBlock模块

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 MultiRes Block 是 MultiResUNet 中核心组件之一,旨在解决传统 U-Net 在处理多尺度医学图像时的局…...

Spring Boot + Vue 接入腾讯云人脸识别API(SDK版本3.1.830)

一、需求分析 这次是基于一个Spring Boot Vue的在线考试系统进行二次开发,添加人脸识别功能以防止学生替考。其他有对应场景的也可按需接入API,方法大同小异。 主要有以下两个步骤: 人脸录入:将某个角色(如学生&…...

【SpringSecurity】springboot整合SpringSecurity实现登录校验与权限认证

【SpringSecurity】springboot整合SpringSecurity实现登录校验与权限认证 【一】SpringSecurity框架简介【二】SpringSecurity与shiro【1】SpringSecurity特点【2】shiro特点【3】SpringSecurity和shiro总结 【三】SpringSecurity过滤器【1】SpringSecurity中常见的过滤器【2】…...

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时,或者某些三方SDK以来的管理后台,都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释: 华为AppGallery Connect简称 AGC平台&#xff0…...

父组件用的是原生监听,子组件用的是onClick,子组件添加了stopPropagation还是没有阻止传播

父组件用事件监听,子组件用onClick,即使子组件加了stopPropagation还是没有阻止冒泡。父组件可能使用原生的addEventListener来绑定事件,而子组件用的是React的onClick事件。这时候,虽然子组件调用了e.stopPropagation()&#xff…...

ui设计公司兰亭妙微分享:科研单位UI界面设计

科研单位的UI界面设计是一项至关重要的任务,它不仅关乎科研工作的效率,还直接影响到科研人员的用户体验。以下是对科研单位UI界面设计的详细分析: 一、设计目标 科研单位的UI界面设计旨在提升科研工作的效率与便捷性,同时确保科…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...