使用日志调试AEM as a Cloud Service

日志是调试AEM as a Cloud Service中AEM应用程序的首选工具,但需要取决于已部署的AEM应用程序中是否有足够的日志记录。

给定环境的AEM服务(创作、Publish/Publish Dispatcher)的所有日志活动都合并到一个日志文件中,即使该服务中的其他pod生成日志语句也是如此。

每个log语句中均提供面板ID,并允许过滤或整理log语句。 面板ID的格式为:

  • cm-p<PROGRAM ID>-e<ENVIRONMENT ID>-aem-<author|publish>-<POD NAME>
  • 示例: cm-p12345-e56789-aem-author-abcdefabde-98765

自定义日志文件

AEM as aCloud Service不支持自定义日志文件,但它支持自定义日志记录。

为了使Java日志在AEM as a Cloud Service中可用(通过Cloud ManagerAdobe I/OCLI),必须将自定义日志语句写入error.log。 无法从AEM as a Cloud Service访问写入自定义命名日志(如example.log)的日志。

可以使用应用程序的org.apache.sling.commons.log.LogManager.factory.config~example.cfg.json文件中的Sling LogManager OSGi配置属性将日志写入error.log

{
   ...
   "org.apache.sling.commons.log.file": "logs/error.log"
   ...
}

AEM Author和Publish服务日志

AEM Author和Publish服务都提供AEM运行时服务器日志:

  • aemerror是Java错误日志(在AEM SDK本地快速入门上的/crx-quickstart/logs/error.log中找到)。 以下是每种环境类型自定义记录器的推荐的日志级别

    • 开发: DEBUG
    • 阶段: WARN
    • 生产: ERROR
  • aemaccess列出了对AEM服务的HTTP请求及详细信息

  • aemrequest列出了向AEM服务发出的HTTP请求及其对应的HTTP响应

AEM Publish Dispatcher日志

只有AEM Publish Dispatcher提供Apache Web Server和Dispatcher日志,因为这些方面仅存在于AEM Publish层,而不存在于AEM创作层。

  • httpdaccess列出了向AEM服务的Apache Web Server/Dispatcher发出的HTTP请求。

  • httperror列出来自Apache Web Server的日志消息,并帮助调试支持的Apache模块,例如mod_rewrite

    • 开发: DEBUG
    • 阶段: WARN
    • 生产: ERROR
  • aemdispatcher列出来自Dispatcher模块的日志消息,包括从缓存消息中过滤和提供服务。

    • 开发: DEBUG
    • 阶段: WARN
    • 生产: ERROR

Cloud Manager cloud-manager

AdobeCloud Manager允许通过环境的“下载日志”操作,按天下载日志。

Cloud Manager — 下载日志

可以通过任何日志分析工具下载并检查这些日志。

使用Cloud Manager插件Adobe I/OCLI aio

AdobeCloud Manager支持通过带有Adobe I/OCLI🔗的AEM as a Cloud Service插件的Adobe I/OCLI访问Cloud Manager日志。

首先,使用Cloud Manager插件设置Adobe I/O。

请确保已识别相关的项目ID和环境ID,并使用list-available-log-options列出用于tail下载日志的日志选项。

$ aio cloudmanager:list-programs
Program Id Name      Enabled
14304      Program 1 true
11454      Program 2 true
11502      Program 3 true

$ aio config:set cloudmanager_programid <PROGRAM ID>

$ aio cloudmanager:list-environments
Environment Id Name            Type  Description
22295          program-3-dev   dev
22310          program-3-prod  prod
22294          program-3-stage stage

$ aio cloudmanager:list-available-log-options <ENVIRONMENT ID>
Environment Id Service    Name
22295          author     aemaccess
22295          author     aemerror
22295          author     aemrequest
22295          publish    aemaccess
22295          publish    aemerror
22295          publish    aemrequest
22295          dispatcher httpdaccess
22295          dispatcher httpderror
22295          dispatcher aemdispatcher

尾随日志 aio-cli-tail-logs

Adobe I/OCLI提供了使用tail-logs命令实时跟踪AEM as a Cloud Service中日志的功能。 在AEM as a Cloud Service环境中执行操作时,跟踪对于监视实时日志活动很有用。

$ aio config:set cloudmanager_programid <PROGRAM ID>
$ aio cloudmanager:tail-logs <ENVIRONMENT ID> <SERVICE> <NAME>

其他命令行工具(如grep)可以与tail-logs配合使用,以帮助隔离感兴趣的日志语句,例如:

$ aio cloudmanager:tail-logs 12345 author | grep com.example.MySlingModel

…仅显示从com.example.MySlingModel生成的或包含该字符串的日志语句。

正在下载日志 aio-cli-download-logs

Adobe I/OCLI提供使用download-logs)命令从AEM as a Cloud Service下载日志的功能。 这将提供与从Cloud Manager Web UI下载日志相同的最终结果,不同之处在于download-logs命令会根据请求的日志天数,跨天合并日志。

$ aio config:set cloudmanager_programid <PROGRAM ID>
$ aio cloudmanager:download-logs <ENVIRONMENT> <SERVICE> <NAME> <DAYS>

了解日志

AEM as a Cloud Service中的日志有多个Pod,用于将Log语句写入其中。 由于多个AEM实例会写入同一个日志文件,因此了解如何在调试时分析并减少噪音非常重要。 为了说明,使用了以下aemerror日志片段:

01.01.2020 12:00:00.000 [cm-p12345-e56789-aem-author-abcdefg-1111] *DEBUG* [qtp2078364989-269] com.example.components.impl.ExampleModelImpl Preparing to collect resources
01.01.2020 12:00:01.002 [cm-p12345-e56789-aem-author-abcdefg-2222] *WARN*  [qtp40782847611-87] com.example.services.impl.ExampleServiceImpl Unable to resolve resource [ /content/example ] to a resource. Aborting.
01.01.2020 12:00:02.003 [cm-p12345-e56789-aem-author-abcdefg-1111] *ERROR* [qtp2078364989-269] com.example.components.impl.ExampleModelImpl Unable to collect any resources

使用Pod ID(日期和时间之后的数据点),可以由Pod或服务中的AEM实例整理日志,从而更容易跟踪和了解代码执行。

Pod cm-p12345-e56789-aem-author-abcdefg-1111

01.01.2020 12:00:00.000 [cm-p12345-e56789-aem-author-abcdefg-1111] *DEBUG* [qtp2078364989-269] com.example.components.impl.ExampleModelImpl Preparing to collect resources
01.01.2020 12:00:02.003 [cm-p12345-e56789-aem-author-abcdefg-1111] *ERROR* [qtp2078364989-269] com.example.components.impl.ExampleModelImpl Unable to collect any resources

Pod cm-p12345-e56789-aem-author-abcdefg-2222

01.01.2020 12:00:01.002 [cm-p12345-e56789-aem-author-abcdefg-2222] *WARN*  [qtp2078364989-269] com.example.services.impl.ExampleServiceImpl Unable to resolve resource [ /content/example ] to a resource. Aborting.

建议的日志级别 log-levels

Adobe关于每个AEM as a Cloud Service环境的日志级别的一般指导包括:

  • 本地开发(AEM SDK): DEBUG
  • 开发: DEBUG
  • 阶段: WARN
  • 生产: ERROR

为每种环境类型设置最合适的日志级别是使用AEM as a Cloud Service,日志级别在代码中进行维护

  • Java日志配置在OSGi配置中进行维护
  • Dispatcher项目中的Apache Web Server和Dispatcher日志级别

…因此,需要更改部署。

用于设置Java日志级别的特定于环境的变量

为每个环境设置静态已知Java日志级别的替代方法是使用AEM作为Cloud Service的环境特定变量来参数化日志级别,从而允许通过带有Cloud Manager插件的Adobe I/OCLI动态更改这些值。

这需要更新日志记录OSGi配置以使用特定于环境的变量占位符。 🔗应根据Adobe建议设置日志级别的默认值。 例如:

/apps/example/config/org.apache.sling.commons.log.LogManager.factory.config~example.cfg.json

{
    ...
    "org.apache.sling.commons.log.names": ["com.example"],
    "org.apache.sling.commons.log.level": "$[env:LOG_LEVEL;default=DEBUG]"
    ...
}

这一方针的弊端必须被考虑在内:

特定于环境的变量不适用于Apache Web Server或Dispatcher日志配置,因为这些配置未通过OSGi配置进行配置。

recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69