使用日志调试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 Manager或Adobe 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插件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]"
...
}
这一方针的弊端必须被考虑在内:
- 允许的环境变量数量有限,创建用于管理日志级别的变量将使用一个。
- 可通过Cloud Manager、Adobe I/OCLI和Cloud Manager HTTP API以编程方式管理环境变量。
- 对环境变量的更改必须由支持的工具手动重置。 如果忘记将高流量环境(如生产)重置为较不详细的日志级别,可能会淹没日志并影响AEM的性能。
特定于环境的变量不适用于Apache Web Server或Dispatcher日志配置,因为这些配置未通过OSGi配置进行配置。