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
选项找到一些方法来配置它。 / p>
其他回复(e.g.,e.g.)表明可以通过提交设置log4j.properties
的{{1}}文件来完成此操作。但是,this link表明log4j.rootCategory=WARN, <appender>
与rootCategory
相同,所以我将此解释为限制所有日志记录(不仅仅是Spark&#39; s)到rootLogger
- 事实上,当我部署一个改变时,这就是所观察到的。
我注意到here的最后一段说&#34; Spark使用log4j进行记录。您可以通过在WARN
目录中添加log4j.properties
文件来配置它。一种方法是复制位于那里的现有conf
。&#34;。我即将尝试使用此功能来查看是否会抑制填充我们日志记录的log4j.properties.template
日志。但是,这仍然不是一个理想的解决方案,因为 某些INFO
日志,Spark发出 有用的日志 - 例如,当它记录数量时每次流式迭代(从S3获取)的文件。所以,我理想的是:
INFO
日志这些都存在吗?
(为了解决可能的反应 - 我不愿在INFO
及以上的地方从我自己的应用程序发出日志)
答案 0 :(得分:1)
您可以通过log4名称spspce从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