Google cloud dataflow 我们如何在生产Forgogle数据流中查看日志(来自记录器实例)?

Google cloud dataflow 我们如何在生产Forgogle数据流中查看日志(来自记录器实例)?,google-cloud-dataflow,Google Cloud Dataflow,我有一个ParDo函数,它在运行超过10万个实例时有效,但在尝试运行超过10亿条记录时失败。此时,我无法使用DirectPipelineRunner运行,必须切换到DataflowPipelineRunner或BlockingDataflowPipelineRunner。我的DoFn中有一个记录器实例化如下: private static final Logger LOG = LoggerFactory.getLogger(EventPipeline.class); 但是,当我单击作业旁边的查

我有一个ParDo函数,它在运行超过10万个实例时有效,但在尝试运行超过10亿条记录时失败。此时,我无法使用DirectPipelineRunner运行,必须切换到DataflowPipelineRunner或BlockingDataflowPipelineRunner。我的DoFn中有一个记录器实例化如下:

private static final Logger LOG = LoggerFactory.getLogger(EventPipeline.class);
但是,当我单击作业旁边的
查看日志
按钮时,我在云日志中看不到
LOG.error(“…”)
的输出。我甚至在选项中切换到
worker
any log level


我是否遗漏了一些明显的内容?

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

对于日志问题-听起来你没有遗漏任何明显的东西。根据您的描述,云日志应该可以正常工作

以下是我对下一步的建议:

  • 确保日志语句正常工作-当您使用DirectPipelineRunner(记录数较少)进行测试时,我假定您会看到日志语句出现。如果是这样,它们肯定会出现在云日志中。您还可以将log语句放在较早的DoFn中(或者放在DoFn代码的较早部分)
  • 确保Dataflow->Cloud Logging通信适合您的工作。您是否在
    工作日志中看到任何日志行,或者只是没有看到特定的错误日志行?如果在
    worker
    日志中看到其他日志行,则很可能意味着发出日志语句的行没有运行

  • 作为最后手段,您可以尝试替换log.error,而不是抛出常规java异常。这将使步骤失败,错误将显示在数据流监视UI中。这将证明日志语句所在的行正在运行,但云日志记录没有接收日志数据。

    我也遇到过同样的问题

    我所做的是在作业执行期间,单击查看日志-->实时流日志(播放按钮)。它流式传输所有日志。在这些日志中,我们的作业日志也存在。但这是一堆其他的日志。很难找到我们的日志。我想我们没有其他选择了


    选择工作人员或更改日志级别对我也没有帮助。

    因为我也遇到了这个问题:你检查过你的类路径了吗

    双重检查类路径上是否没有
    Log4j
    和/或
    slf4j-Log4j
    绑定。 云日志记录基于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>
    
    
    org.slf4j
    log4j-over-slf4j
    一些
    附属国
    slf4j-log4j12
    org.slf4j
    log4j
    log4j
    

    在类路径上记录commons是可以的(第三方依赖可能会使用它)。只要确保它不使用log4j作为绑定。

    如果您仍然可以从堆栈驱动程序控制台看到数据流工作程序日志。问题是我们需要项目的正确依赖关系,这是以下两种依赖关系:

    <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>
    
    
    org.slf4j
    slf4j api
    org.slf4j
    slf4j-jdk14
    运行时
    真的
    

    还要确保不包括其他日志库,如log4j、logback等。

    很遗憾,日志筛选视图不适合您。我们最近修复了云日志用户界面中的几个bug,当通过查看日志链接打开日志名称过滤器和作业过滤器时,它们应该能够正常工作。实时流日志可以很好地使用这些过滤器,只需向您显示您的工作的
    工作日志(除了您在代码中发出的日志行之外,日志应该包含很少的内容。)@DavorBonaci-感谢您更新我。下次运行数据流作业时,我将查看日志。如果日志根本不起作用,应该怎么做?我看到了工作日志,但没有一条日志行直接来自我的管道。