我有一个ParDo功能,在运行超过100K的实例时有效但在我尝试运行超过十亿个记录时失败。此时,我无法使用DirectPipelineRunner运行,必须切换到DataflowPipelineRunner或BlockingDataflowPipelineRunner。我在我的DoFn中实例化了一个记录器:
<x-myelement title="Hello Polymer"
items='[{"code":1,"name":"Item #1"},{"code":2,"name":"Item #2"},{"code":3,"name":"Item #3"}]'>
</x-myelement>
但是,当我点击作业旁边的private static final Logger LOG = LoggerFactory.getLogger(EventPipeline.class);
按钮时,我在云日志中看不到LOG.error('...')
的输出。我甚至在选项中切换到View Logs
并将日志级别切换为worker
。
我错过了一些明显的东西吗?
答案 0 :(得分:1)
为了确保我理解您问题的背景:您刚刚开始使用[Blocking]DataflowPipelineRunner
,并且正在尝试找出如何调试您的工作,因为您无法在本地查看日志输出/使用您的其他本地调试工具。
对于日志问题 - 它听起来并不像你错过任何明显的东西。根据您的描述,云记录应该可以正常工作。
以下是我建议的后续步骤:
worker
日志中看到了任何日志行,或者只是您的特定错误日志行?如果您在worker
日志中看到其他日志行,则很可能意味着发出日志记录语句的行不会运行。作为最后的手段,您可以尝试替换log.error,而是抛出常规的Java异常。这将使步骤失败,并且错误将显示在数据流监视UI中。这将证明日志语句正在运行的行,但云日志记录没有接收日志记录数据。
答案 1 :(得分:0)
我也经历过同样的问题。
我所做的是在作业执行期间,点击查看日志 - &gt;直播日志(播放按钮)。它会传输所有日志。在这些日志中,我们的工作日志也存在。但它与其他一堆日志。很难找到我们的日志。我认为我们没有其他选择。
选择工作人员或更改日志级别也没有帮助我。
答案 2 :(得分:0)
仅仅因为我也遇到了这个问题:你检查了你的类路径吗?
仔细检查类路径上没有Log4j
和/或slf4j-log4j
绑定。
Cloud日志记录基于SLF4j,但log4j会阻止日志记录。如果是这样,请将其从包含中排除,只提供log4j-over-slf4j
:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>some</groupId>
<artifactId>dependency</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<!-- and / or depending on the upstream pom.xml -->
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
在类路径上进行commons-logging很好(第三方依赖可能会使用它)。只需确保它不会将log4j用作绑定。
答案 3 :(得分:0)
如果仍然可以从堆栈驱动程序控制台中看到数据流工作程序日志。问题是我们需要正确的项目依赖关系,这是以下两个依赖关系:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
还要确保不包括其他日志记录库,例如log4j,logback等。