抑制特定的 Spark 日志记录消息

scu*_*bbo 4 logging log4j apache-spark

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 客户支持和各种答案(例如)表明,这可以通过在集群创建时传递一些 JSON 配置来实现。然而,由于这是一个流作业(理想情况下,集群将永远保持运行并重新部署),我想找到一些方法来通过spark-submit选项配置它。

其他响应(例如例如)建议这可以通过提交一个log4j.properties设置的文件来完成log4j.rootCategory=WARN, <appender>。然而,这个链接表明这rootCategory与 是一样的rootLogger,所以我将其解释为将所有日志记录(不仅仅是 Spark 的)限制为WARN- 事实上,当我部署一个更改来执行此操作时,这就是观察到的情况。

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

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

其中任何一个存在吗?

(为了解决可能的响应 - 我不愿意只从我自己的应用程序中发出日志WARN

小智 5

您可以通过 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
Run Code Online (Sandbox Code Playgroud)