如何停止在火花控制台上显示INFO消息?

问题描述 投票:147回答:18

我想停止火花壳上的各种消息。

我试图编辑log4j.properties文件以阻止这些消息。

以下是log4j.properties的内容

# Define the root logger with appender file
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

但是消息仍在控制台上显示。

以下是一些示例消息

15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster
15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba
15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B.
15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728)
15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager
15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM
15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager
15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server
15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star

我该如何阻止这些?

apache-spark log4j spark-submit
18个回答
147
投票

编辑您的conf/log4j.properties文件并更改以下行:

log4j.rootCategory=INFO, console

log4j.rootCategory=ERROR, console

另一种方法是:

启动spark-shell并输入以下内容:

import org.apache.log4j.Logger
import org.apache.log4j.Level

Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

之后你不会看到任何日志。

Level的其他选项包括:alldebugerrorfatalinfoofftracetrace_intwarn

Details about each can be found in the documentation.


4
投票

All the methods collected with examples

Intro

实际上,有很多方法可以做到这一点。有些人比其他人更难,但是由你决定哪一个最适合你。我会尽力展示它们。


#1 Programatically in your app

似乎是最简单的,但您需要重新编译您的应用程序才能更改这些设置。就个人而言,我不喜欢它,但它工作正常。

Example:

import org.apache.log4j.{Level, Logger}

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)

只需使用log4j API即可实现更多功能。 资料来源:[Log4J Configuration Docs,配置部分]


#2 Pass log4j.properties during spark-submit

这个非常棘手,但并非不可能。而我最喜欢的。

应用程序启动期间的Log4J始终在查找并从类路径加载log4j.properties文件。

但是,使用spark-submit时,Spark Cluster的类路径优先于app的类路径!这就是为什么把这个文件放在你的fat-jar中不会覆盖集群的设置!

-Dlog4j.configuration=<location of configuration file>添加到spark.driver.extraJavaOptions(为司机)或 spark.executor.extraJavaOptions(执行人)。

请注意,如果使用文件,则应明确提供file:协议,并且该文件需要在所有节点上本地存在。

要满足最后一个条件,您可以将文件上传到节点可用的位置(如hdfs),或者如果使用deploy-mode client则使用驱动程序在本地访问它。除此以外:

使用spark-submit上传自定义log4j.properties,将其添加到要与应用程序一起上传的--files文件列表中。

资料来源:Spark docs, Debugging

Steps:

示例log4j.properties

# Blacklist all to warn level
log4j.rootCategory=WARN, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO

执行spark-submit,用于集群模式:

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"

请注意,如果使用--driver-java-options模式,则必须使用clientSpark docs, Runtime env

执行spark-submit,用于客户端模式:

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"

Notes:

  1. 使用spark-cluster上传到--files的文件将在root目录中提供,因此无需在file:log4j.properties中添加任何路径。
  2. --files中列出的文件必须提供绝对路径!
  3. 配置URI中的file:前缀是必需的。

#3 Edit cluster's conf/log4j.properties

这会更改全局日志配置文件。

更新$SPARK_CONF_DIR/log4j.properties文件,它将与其他配置一起自动上传。

资料来源:Spark docs, Debugging

要找到你的SPARK_CONF_DIR,你可以使用spark-shell

atais@cluster:~$ spark-shell 
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1
      /_/   

scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf

现在只需编辑/var/lib/spark/latest/conf/log4j.properties(使用方法#2中的示例),您的所有应用程序都将共享此配置。


#4 Override configuration directory

如果你喜欢解决方案#3,但想要为每个应用程序自定义它,你可以实际复制conf文件夹,编辑它的内容并在spark-submit期间指定为root配置。

要指定除默认“SPARK_HOME/conf”之外的其他配置目录,可以设置SPARK_CONF_DIR。 Spark将使用此目录中的配置文件(spark-defaults.confspark-env.shlog4j.properties等)。

资料来源:Spark docs, Configuration

Steps:

  1. 复制群集的conf文件夹(更多信息,方法#3)
  2. 在该文件夹中编辑log4j.properties(方法#2中的示例)
  3. 在执行SPARK_CONF_DIR之前,将spark-submit设置为此文件夹, 例: export SPARK_CONF_DIR=/absolute/path/to/custom/conf spark-submit \ --master yarn \ --deploy-mode cluster \ --class com.github.atais.Main \ "SparkApp.jar"

Conclusion

我不确定是否还有其他方法,但我希望这涵盖从A到Z的主题。如果没有,请随时在评论中ping我!

享受你的方式!


2
投票

一个有趣的想法是使用这里建议的RollingAppender:http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/,这样你就不会“控制”控制台空间,但仍然能够在$ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log下看到结果。

    log4j.rootLogger=INFO, rolling

log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=50MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log
log4j.appender.rolling.encoding=UTF-8

解决问题的另一种方法是观察您通常具有哪种记录(来自不同的模块和依赖项),并为每个记录的粒度设置,同时转换过于冗长的“安静”第三方日志:

例如,

    # Silence akka remoting
log4j.logger.Remoting=ERROR
log4j.logger.akka.event.slf4j=ERROR
log4j.logger.org.spark-project.jetty.server=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.com.anjuke.dm=${dm.logging.level}
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

2
投票

只需在您的spark-shell OR spark-submit命令中添加以下参数即可

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

从log4j.properties文件中检查确切的属性名称(log4jspark.root.logger)。希望这会有所帮助,欢呼!


1
投票

在命令行上很简单......

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..其他选择..


0
投票
  1. 调整conf / log4j.properties,如其他log4j.rootCategory = ERROR,console所述
  2. 确保在执行spark作业时,使用log4j.properties文件路径传递--file标志
  3. 如果它仍然不起作用,您可能有一个jar,其log4j.properties在您的新log4j.properties之前被调用。从jar中删除log4j.properties(如果适用)

0
投票
sparkContext.setLogLevel("OFF")

0
投票

除了以上所有帖子之外,以下是解决这个问题的方法。

Spark使用slf4j绑定到记录器。如果log4j不是第一个找到的绑定,您可以编辑所有想要的log4j.properties文件,甚至不使用记录器。例如,这可能是一个可能的SLF4J输出:

SLF4J:类路径包含多个SLF4J绑定。 SLF4J:在[jar:file:/ C:/Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar!/ org / slf4j /中找到绑定impl / StaticLoggerBinder.class] SLF4J:在[jar:file:/ C:/Users/~/.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar中找到绑定!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J:有关解释,请参阅http://www.slf4j.org/codes.html#multiple_bindings。 SLF4J:实际绑定的类型为[org.slf4j.impl.SimpleLoggerFactory]

所以这里使用了SimpleLoggerFactory,它不关心log4j设置。

通过我的项目排除slf4j-simple软件包

<dependency>
        ...
        <exclusions>
            ...
            <exclusion>
                <artifactId>slf4j-simple</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>

解决了这个问题,因为现在使用了log4j logger绑定并且遵守了log4j.properties中的任何设置。 F.Y.I.我的log4j属性文件包含(除正常配置外)

log4j.rootLogger=WARN, stdout
...
log4j.category.org.apache.spark = WARN
log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL
log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false
log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF

希望这可以帮助!


0
投票

这个对我有用。仅将ERROR消息显示为stdoutlog4j.properties文件可能如下所示:

# Root logger option
log4j.rootLogger=ERROR, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

注意:将log4j.properties文件放在src/main/resources文件夹中才有效。如果log4j.properties不存在(意思是spark正在使用log4j-defaults.properties文件),那么您可以通过转到SPARK_HOME/conf然后mv log4j.properties.template log4j.properties创建它,然后继续上述所述更改。


0
投票

如果您无法编辑Java代码以插入.setLogLevel()语句,并且您不希望部署更多外部文件,则可以使用强力方法来解决此问题。只需使用grep过滤出INFO行。

spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"

120
投票

在启动spark-shell类型之后;

sc.setLogLevel("ERROR")

在Spark 2.0中:

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")

45
投票

感谢@AkhlD和@Sachin Janani建议更改.conf文件。

以下代码解决了我的问题:

1)在导入部分添加了import org.apache.log4j.{Level, Logger}

2)在创建spark上下文对象后添加以下行,即在val sc = new SparkContext(conf)之后:

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

27
投票

使用spark-submit或spark-sql在提交应用程序时使用以下命令更改日志级别:

spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"

注意:替换存储<file path>配置文件的log4j

log4就.properties:

log4j.rootLogger=ERROR, console

# set the log level for these components
log4j.logger.com.test=DEBUG
log4j.logger.org=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.org.spark-project=ERROR
log4j.logger.org.apache.hadoop=ERROR
log4j.logger.io.netty=ERROR
log4j.logger.org.apache.zookeeper=ERROR

# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
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

的log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
  </appender>
    <logger name="org.apache.spark">
        <level value="error" />
    </logger>
    <logger name="org.spark-project">
        <level value="error" />
    </logger>
    <logger name="org.apache.hadoop">
        <level value="error" />
    </logger>
    <logger name="io.netty">
        <level value="error" />
    </logger>
    <logger name="org.apache.zookeeper">
        <level value="error" />
    </logger>
   <logger name="org">
        <level value="error" />
    </logger>
    <root>
        <priority value ="ERROR" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>

如果要将日志写入文件而不是控制台,请在log4j.xml中切换到FileAppender。 LOG_DIR是日志目录的变量,您可以使用spark-submit --conf "spark.driver.extraJavaOptions=-D提供。

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${LOG_DIR}"/>
        <param name="datePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>

这里要理解的另一个重要事项是,当作业以分布式模式启动时(部署模式集群和master作为yarn或mesos),log4j配置文件应该存在于驱动程序和工作节点(log4j.configuration=file:<file path>/log4j.xml)上,否则log4j init会抱怨 -

log4j:ERROR无法读取配置文件[log4j.properties]。 java.io.FileNotFoundException:log4j.properties(没有这样的文件或目录)

提示解决这个问题 -

将log4j配置文件保存在分布式文件系统(HDFS或mesos)中,并使用log4j PropertyConfigurator添加外部配置。或者使用sparkContext addFile使其在每个节点上可用,然后使用log4j PropertyConfigurator重新加载配置。


18
投票

您可以通过将其级别设置为OFF来禁用日志,如下所示:

Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);

或者通过更改以下属性来编辑日志文件并将日志级别设置为off:

log4j.rootCategory=OFF, console

13
投票

我只是将这一行添加到导入语句下面的所有pyspark脚本中。

SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

我的pyspark脚本的示例标题

from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

12
投票

上面的答案是正确的,但并没有完全帮助我,因为我需要其他信息。

我刚刚设置了Spark,因此log4j文件仍然具有'.template'后缀并且未被读取。我相信日志记录默认为Spark核心日志配置。

所以,如果你像我一样发现上面的答案没有帮助,那么也许你也必须从你的log4j conf文件中删除'.template'后缀,然后上面的工作完美!

http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html


5
投票

tl;dr

对于Spark Context,您可以使用:

sc.setLogLevel(<logLevel>)

其中loglevel可以是ALL,DEBUG,ERROR,FATAL,INFO,OFF,TRACE或WARN。


细节-

在内部,setLogLevelorg.apache.log4j.Level.toLevel(logLevel)然后使用org.apache.log4j.LogManager.getRootLogger().setLevel(level)设置。

您可以使用以下命令直接将日志记录级别设置为OFF

LogManager.getLogger("org").setLevel(Level.OFF)

您可以在conf/log4j.properties中设置Spark shell的默认日志记录。使用conf/log4j.properties.template作为起点。

Setting Log Levels in Spark Applications

在独立Spark应用程序中或在Spark Shell会话中,使用以下命令:

import org.apache.log4j.{Level, Logger}

Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

Disabling logging(in log4j):

conf/log4j.properties中使用以下命令来完全禁用日志记录:

log4j.logger.org=OFF

参考:Jacek Laskowski掌握Spark。


4
投票

在Python / Spark中我们可以做到:

def quiet_logs( sc ):
  logger = sc._jvm.org.apache.log4j
  logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
  logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )

定义Sparkcontaxt'sc'之后调用此函数:quiet_logs(sc)

© www.soinside.com 2019 - 2024. All rights reserved.