你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

实时流式处理 Azure Spring Apps 托管组件日志

注意

Azure Spring Apps 是 Azure Spring Cloud 服务的新名称。 虽然该服务有新名称,但一些地方仍会使用旧名称,我们仍在更新屏幕截图、视频和图形等资产。

本文适用于:❌ 基本版/标准版 ✔️ 企业版

本文介绍如何使用 Azure CLI 获取托管组件的实时日志进行故障排除。 还可以使用诊断设置来分析 Azure Spring Apps 中的诊断数据。 有关详细信息,请参阅使用诊断设置分析日志和指标

有关 Azure Spring Apps 中应用程序的流式处理日志,请参阅实时流式处理 Azure Spring Apps 应用程序控制台日志

先决条件

  • 具有 Azure Spring Apps 扩展的 Azure CLI,版本 1.19.0 或更高版本。 可以使用以下命令安装扩展:az extension add --name spring

支持的托管组件

下表列出了当前支持的托管组件及其子组件:

托管组件 子组件
应用程序配置服务 application-configuration-service
flux-source-controller(在 ACS Gen2 版本中受支持)
Spring Cloud 网关 spring-cloud-gateway
spring-cloud-gateway-operator

可以使用以下命令列出所有子组件:

az spring component list
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name>

分配 Azure 角色

若要流式传输托管组件的日志,必须分配有相关的 Azure 角色。 下表列出了所需的角色以及向这些角色授予权限以进行的操作:

托管组件 所需角色 Operations
应用程序配置服务 Azure Spring Apps 应用程序配置服务日志读取者角色 Microsoft.AppPlatform/Spring/ApplicationConfigurationService/logstream/action
Spring Cloud 网关 Azure Spring Apps Spring Cloud Gateway 日志读取者角色 Microsoft.AppPlatform/Spring/SpringCloudGateway/logstream/action

按照以下步骤使用 Azure 门户分配 Azure 角色:

  1. 打开 Azure 门户

  2. 打开你的 Azure Spring Apps 服务实例。

  3. 在导航窗格中,选择“访问控制(IAM)”。

  4. 在“访问控制(IAM)”页上选择“添加”,然后选择“添加角色分配”

    Azure 门户中显示“访问控制(标识和访问管理)”页的屏幕截图,其中突出显示了“添加角色分配”选项。

  5. 在“添加角色分配”页上的“名称”列表中,搜索并选择目标角色,然后选择“下一步”

    Azure 门户中显示“添加角色分配”页的屏幕截图,其中突出显示了“应用程序配置服务日志读者角色”名称。

  6. 选择“成员”,然后搜索并选择你的用户名

  7. 选择“查看 + 分配”。

列出组件中的所有实例

使用以下命令列出组件中的所有实例:

az spring component instance list \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --component <component-name>

例如,若要列出 ACS Gen2 版本中 flux-source-controller 的所有实例,请使用以下命令:

az spring component instance list \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --component flux-source-controller

查看跟踪日志

本部分提供了使用 Azure CLI 生成跟踪日志的示例。

查看特定实例的跟踪日志

若要查看特定实例的跟踪日志,请使用带 -i/--instance 参数的 az spring component logs 命令,如下一部分所示。

查看 application-configuration-service 实例的跟踪日志

使用以下命令查看 application-configuration-service 的跟踪日志:

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name application-configuration-service \
    --instance <instance-name>

对于 ACS Gen2,该命令返回类似于以下示例的日志:

...
2023-12-18T07:09:54.020Z  INFO  16715 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8090 (https)
2023-12-18T07:09:54.116Z  INFO  16715 --- [main] org.apache.juli.logging.DirectJDKLog     : Starting service [Tomcat]
2023-12-18T07:09:54.117Z  INFO  16715 --- [main] org.apache.juli.logging.DirectJDKLog     : Starting Servlet engine: [Apache Tomcat/10.1.12]
2023-12-18T07:09:54.522Z  INFO  16715 --- [main] org.apache.juli.logging.DirectJDKLog     : Initializing Spring embedded WebApplicationContext
2023-12-18T07:09:54.524Z  INFO  16715 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 14100 ms
2023-12-18T07:09:56.920Z  INFO  16715 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8090 (https) with context path ''
2023-12-18T07:09:57.528Z  INFO  16715 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2023-12-18T07:09:57.529Z  INFO  16715 --- [main] org.apache.juli.logging.DirectJDKLog     : Starting service [Tomcat]
2023-12-18T07:09:57.529Z  INFO  16715 --- [main] org.apache.juli.logging.DirectJDKLog     : Starting Servlet engine: [Apache Tomcat/10.1.12]
2023-12-18T07:09:57.629Z  INFO  16715 --- [main] org.apache.juli.logging.DirectJDKLog     : Initializing Spring embedded WebApplicationContext
2023-12-18T07:09:57.629Z  INFO  16715 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 603 ms
2023-12-18T07:09:57.824Z  INFO  16715 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2023-12-18T07:09:58.127Z  INFO  16715 --- [main] o.springframework.boot.StartupInfoLogger : Started ReconcilerApplication in 21.005 seconds (process running for 22.875)
...

查看 flux-source-controller 实例的跟踪日志

使用以下命令查看 flux-source-controller 的跟踪日志:

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name flux-source-controller \
    --instance <instance-name>

该命令将返回类似于以下示例的日志:

...
{"level":"info","ts":"2023-12-18T07:07:54.615Z","logger":"controller-runtime.metrics","msg":"Metrics server is starting to listen","addr":":8080"}
{"level":"info","ts":"2023-12-18T07:07:54.615Z","logger":"setup","msg":"starting manager"}
{"level":"info","ts":"2023-12-18T07:07:54.615Z","msg":"Starting server","path":"/metrics","kind":"metrics","addr":"[::]:8080"}
{"level":"info","ts":"2023-12-18T07:07:54.615Z","msg":"Starting server","kind":"health probe","addr":"[::]:9440"}
{"level":"info","ts":"2023-12-18T07:07:54.817Z","logger":"runtime","msg":"attempting to acquire leader lease flux-system/source-controller-leader-election...\n"}
{"level":"info","ts":"2023-12-18T07:07:54.830Z","logger":"runtime","msg":"successfully acquired lease flux-system/source-controller-leader-election\n"}
...

查看 spring-cloud-gateway 实例的跟踪日志

使用以下命令查看 spring-cloud-gateway 的跟踪日志:

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name spring-cloud-gateway \
    --instance <instance-name>

该命令将返回类似于以下示例的日志:

...
2023-12-11T14:13:40.310Z  INFO 1 --- [           main] i.p.s.c.g.s.SsoDeactivatedConfiguration  : SSO is deactivated, setting up default security filters
2023-12-11T14:13:40.506Z  INFO 1 --- [           main] .h.HazelcastReactiveSessionConfiguration : Configuring Hazelcast as a session management storage
2023-12-11T14:13:51.008Z  INFO 1 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8443
2023-12-11T14:13:51.810Z  INFO 1 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 7 endpoint(s) beneath base path '/actuator'
2023-12-11T14:13:52.410Z  INFO 1 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8090
2023-12-11T14:13:52.907Z  INFO 1 --- [           main] i.p.s.c.g.r.h.HazelcastRateLimitsRemover : Removing Hazelcast map 'GLOBAL_RATE_LIMIT' with rate limit information
2023-12-11T14:13:52.912Z  INFO 1 --- [           main] i.p.s.cloud.gateway.GatewayApplication   : Started GatewayApplication in 36.084 seconds (process running for 38.651)
...

查看 spring-cloud-gateway-operator 实例的跟踪日志

使用以下命令查看 spring-cloud-gateway-operator 的跟踪日志:

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name spring-cloud-gateway-operator \
    --instance <instance-name>

该命令将返回类似于以下示例的日志:

...
2023-12-01T08:37:05.080Z  INFO 1 --- [           main] c.v.t.s.OperatorApplication              : Starting OperatorApplication v2.0.6 using Java 17.0.7 with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)
2023-12-01T08:37:05.157Z  INFO 1 --- [           main] c.v.t.s.OperatorApplication              : No active profile set, falling back to 1 default profile: "default"
2023-12-01T08:37:14.379Z  INFO 1 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2023-12-01T08:37:15.274Z  INFO 1 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8080
2023-12-01T08:37:15.366Z  INFO 1 --- [           main] c.v.t.s.OperatorApplication              : Started OperatorApplication in 11.489 seconds (process running for 12.467)
...

在一个命令中查看所有实例的跟踪日志

若要查看所有实例的跟踪日志,请使用 --all-instances 参数,如以下命令中所示。 实例名称是每个日志行的前缀。 如果有多个实例,则为每个实例批量打印日志,因此一个实例的日志不会与另一个实例的日志交错混杂。

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name <component-name> \
    --all-instances

连续流式传输新日志

默认情况下,az spring component logs 仅打印流式传输到控制台的现有日志,然后退出。 如果要流式传输新日志,请添加 -f/--follow 参数。

使用 -f/--follow 选项跟踪即时日志时,Azure Spring Apps 日志流式处理服务会每隔一分钟向客户端发送一次检测信号日志,除非该组件不断写入日志。 检测信号日志消息使用以下格式:2023-12-18 09:12:17.745: No log from server

流式传输特定实例的日志

使用以下命令流式传输特定实例的日志:

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name <component-name> \
    --instance <instance-name> \
    --follow

流式传输所有实例的日志

使用以下命令流式传输所有实例的日志:

az spring component logs \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name <component-name> \
    --all-instances \
    --follow

在组件中流式传输多个实例的日志时,一个实例的日志与其他实例的日志交错。

在虚拟网络注入实例中流式传输日志

对于部署在自定义虚拟网络中的 Azure Spring Apps 实例,可以默认从专用网络访问日志流式处理。 有关详细信息,请参阅在虚拟网络中部署 Azure Spring Apps

借助 Azure Spring Apps,还可以从公用网络访问实时托管组件日志。

注意

如果在公用网络上启用日志流式处理终结点,会将公共入站 IP 添加到虚拟网络。 如果你担心这一点,请务必谨慎使用。

使用以下步骤在公用网络上启用日志流式处理终结点:

  1. 选择虚拟网络中部署的 Azure Spring Apps 服务实例,然后在导航菜单中选择“网络”。

  2. 选择“Vnet 注入”选项卡。

  3. 将“公共网络上的数据平面资源”的状态切换为“启用”,以在公共网络上启用日志流式处理终结点。 此过程需要花费几分钟时间。

    Azure 门户中显示“网络”页的屏幕截图,其中选择了“Vnet 注入”选项卡,并突出显示了“故障排除”部分。

启用日志流公共终结点后,可以从公用网络访问托管组件日志,就像访问普通实例一样。

保护流向日志流式处理公共终结点的流量

托管组件的日志流式处理使用 Azure RBAC 对组件的连接进行身份验证。 因此,只有具有适当角色的用户才能访问日志。

若在公开托管组件的公共终结点时确保托管组件的安全性,请使用网络安全组筛选发到服务的网络流量来保护终结点。 有关详细信息,请参阅教程:在 Azure 门户中使用网络安全组筛选网络流量。 网络安全组包含安全规则,这些规则可允许或拒绝多种 Azure 资源的入站和出站网络流量。 可以为每项规则指定源和目标、端口以及协议。

注意

如果在启用日志流公共终结点后,无法通过 Internet 访问虚拟网络注入实例中的托管组件日志,请检查网络安全组,查看是否允许此类入站流量。

下表显示了我们推荐的基本规则示例。 可将 nslookup 等命令与 <service-name>.private.azuremicroservices.io 终结点结合使用来获取服务的目标 IP 地址。

优先级 名称 端口 协议 目标 操作
100 规则名称 80 TCP Internet 服务 IP 地址 Allow
110 规则名称 443 TCP Internet 服务 IP 地址 Allow

后续步骤