我们如何在google Dataflow的制作中看到日志(来自Logger实例)?

时间:2015-08-09 21:21:44

标签: google-cloud-dataflow

我有一个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

我错过了一些明显的东西吗?

4 个答案:

答案 0 :(得分:1)

为了确保我理解您问题的背景:您刚刚开始使用[Blocking]DataflowPipelineRunner,并且正在尝试找出如何调试您的工作,因为您无法在本地查看日志输出/使用您的其他本地调试工具。

对于日志问题 - 它听起来并不像你错过任何明显的东西。根据您的描述,云记录应该可以正常工作。

以下是我建议的后续步骤:

  1. 确保日志记录语句正常工作 - 当您使用DirectPipelineRunner(具有较小的记录数)对其进行测试时,我认为您正在看到日志语句出现。如果是这样的话,他们肯定应该出现在Cloud Logs中。您还可以在早期的DoFn中放置一个日志语句(或者只是在DoFn代码的早期内部。)
  2. 确保数据流 - &gt; Cloud Logging通信适用于您的工作。您是否在worker日志中看到了任何日志行,或者只是您的特定错误日志行?如果您在worker日志中看到其他日志行,则很可能意味着发出日志记录语句的行不会运行。
  3. 作为最后的手段,您可以尝试替换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等。