在 docker RTS 沙箱中使用 log4j 登录 Apache Apex

Logging in Apache Apex using log4j in docker RTS sandbox

我想了解在使用官方 RTS Test Sandbox in docker 时如何在 Apache Apex 中使用 log4j 查看我的应用程序日志。 更具体地说,我想知道 Apex 将特定于应用程序的日志文件存储在容器内的什么位置。

我是运行这里描述的最新官方docker图片:https://hub.docker.com/r/datatorrent/rts/

http://localhost:9090/ 上使用 dtManage 运行,我成功上传并启动了我的应用程序。 在 Monitor 选项卡中,我可以看到我的运算符正在接收和发送元组。 当我单击名为 AM logs 的蓝色按钮时,它会显示 3 个日志文件的下拉列表,即:

当我打开并搜索所有 3 个文件的日志时,我可以看到很多来自 apex 的日志,但是 none 我的自定义应用程序日志被打印出来了。 我的日志记录代码如下所示:

private static final Logger LOG = LoggerFactory.getLogger(Application.class);
LOG.info("helloworld");

虽然 运行 Local Mode 中的应用程序,但我的所有日​​志都在控制台中可见。

在properties.xml我也启用了完全调试:

  <property>
    <name>dt.attr.DEBUG</name>
    <value>true</value>
  </property>

有人可以帮我吗?

如果您将日志添加到 Application.java,您将在其中将运算符和流添加到 DAG。它实际上在 Apex 应用程序启动时运行,日志可以是 dt-gateway.log 的一部分(可以在 ~/.dt/logs. 找到)

如果您在操作员中有日志记录语句,您将在各个容器日志目录中找到它们。 (从 RTS 中,您可以访问各个容器,并可以找到与 Application Master 类似的下拉列表,其中包含特定于容器的日志)。

默认情况下,应用程序日志目录可以在yarn指定的日志目录中找到(nodemanager 属性 yarn.nodemanage.log-dirs被用作日志目录位置)。个别容器的日志目录将被命名为container_ {$container_id}。除了应用程序日志,这些目录还将包含该容器的 stderr、stdout 和 syslog。如果容器 运行 在不同的节点上,那么日志将在各个节点上。

${yarn.nodemanager.log-dirs}/application_${appid}

或者您可以使用以下命令打开 yarn 日志聚合以查找日志。

 yarn logs -applicationId ${your-app-id} 

您还可以将属性添加到属性文件以打开特定于您的应用程序的调试日志。

 <property>
    <name>dt.loggers.level</name>
    <value>your.application.package.*:DEBUG</value>
  </property>