【问题标题】:Suppress specific Spark logging messages抑制特定的 Spark 日志记录消息
【发布时间】:2018-01-26 11:19:51
【问题描述】:

TL;DR 是否可以在不破坏所有日志的情况下抑制单个 Spark 日志消息?

我正在 EMR 上运行 Spark Streaming 作业,并收到如下日志消息:

17/08/17 21:09:00 INFO TaskSetManager: Finished task 101.0 in stage 5259.0 (TID 315581) in 17 ms on ip-172-31-37-216.ec2.internal (107/120) 17/08/17 21:09:00 INFO MapPartitionsRDD: Removing RDD 31559 from persistence list 17/08/17 21:09:00 INFO DAGScheduler: Job 2629 finished: foreachPartition at StreamingSparkJob.scala:52, took 0.080085 s 17/08/17 21:09:00 INFO DAGScheduler: ResultStage 5259 (foreachPartition at StreamingSparkJob.scala:52) finished in 0.077 s 17/08/17 21:09:00 INFO JobScheduler: Total delay: 0.178 s for time 1503004140000 ms (execution: 0.084 s)

在这个开发阶段,这些都没有帮助,并且掩盖了我的应用程序故意发出的真实日志记录。我想阻止 Spark 发出这些日志消息,或禁止记录它们。

AWS 客户支持和各种答案 (e.g.) 表明这可以通过在集群创建时传递一些 JSON 配置来实现。但是,由于这是一项流式作业(理想情况下,集群将永远保持运行状态并重新部署到该作业),我想通过spark-submit 选项找到一些方法来配置它。

其他回复(e.g.e.g.)建议可以通过提交设置log4j.rootCategory=WARN, <appender>log4j.properties 文件来完成此操作。但是,this link 表明 rootCategoryrootLogger 相同,因此我将其解释为将 all 日志记录(不仅仅是 Spark 的)限制为 WARN - 实际上,当我为此部署了一个更改,这就是观察到的。

我注意到here 的最后一段说“Spark 使用log4j 进行日志记录。您可以通过在conf 目录中添加log4j.properties 文件来配置它。开始的一种方法是复制位于那里的现有log4j.properties.template"。我将对此进行试验,看看这是否会抑制填满我们日志的INFO 日志。然而,这仍然不是一个理想的解决方案,因为 有一些 Spark 发出的 INFO 日志有用的 - 例如,当它记录文件的数量时每次流式迭代都被拾取(从 S3)。所以,理想情况下,我希望是以下之一:

  • 可以切换配置标志以禁用 Spark 日志消息的特定类,而不抑制所有 INFO 日志
  • “抑制与此正则表达式匹配的所有日志记录”选项,我们可以根据需要对其进行更新以过滤掉我们不感兴趣的消息

这些都存在吗?

(为了解决可能的响应 - 我不愿意只在 WARN 及以上的应用程序中发出日志)

【问题讨论】:

    标签: apache-spark logging log4j


    【解决方案1】:

    您可以通过 log4j.properties 中的记录器名称空间来控制日志,这是一个示例:

    log4j.rootLogger=WARN, console
    # add a ConsoleAppender to the logger stdout to write to the console
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.out
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    # use a simple message format
    log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    # set the log level for these components
    log4j.logger.org.apache.spark=WARN
    log4j.logger.org.spark-project=ERROR
    log4j.logger.org.apache.hadoop=ERROR
    log4j.logger.io.netty=ERROR
    log4j.logger.org.apache.zookeeper=ERROR
    

    【讨论】:

    • 谢谢!我不知道您可以在包级别设置不同的日志记录级别,您的示例帮助我注意到日志记录消息在其序言中包含类名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多