如何阻止INFO消息显示火花控制台上?如何阻止INFO消息显示火花控制台上?(How to stop

2019-05-10 09:58发布

我想停止那些对火花外壳到来的各种消息。

我尝试过编辑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

如何阻止这些?

Answer 1:

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

log4j.rootCategory=INFO, console

log4j.rootCategory=ERROR, console

另一种方法是:

开始在下面的火花外壳和类型:

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

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

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

对于级别其他选项包括: alldebugerrorfatalinfoofftracetrace_intwarn

关于每个细节可以在文档中找到。



Answer 2:

右键启动后spark-shell型;

sc.setLogLevel("ERROR")

在星火2.0:

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


Answer 3:

感谢@AkhlD和@Sachin贾纳尼的建议在变化.conf文件。

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

1)增加import org.apache.log4j.{Level, Logger}进口节

2)添加下列行火花上下文对象的创建之后,即后val sc = new SparkContext(conf)

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


Answer 4:

使用下面的命令来更改日志级别,而使用递交申请火花提交或火花-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配置文件被存储。

Log4j.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> 

如果你想要写日志文件,而不是控制台切换到FileAppender中的log4j.xml。 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> 

了解这里另一个重要的事情是,当作业在分布式模式下启动(部署模式集群和主纱或mesos)log4j的配置文件应在驱动程序和工作节点(存在log4j.configuration=file:<file path>/log4j.xml )其他log4j的init将complain-

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

提示解决这个problem-

保持log4j的配置文件在分布式文件系统(HDFS或mesos),并使用添加外部配置的log4j PropertyConfigurator 。 或使用sparkContext addFile以使其可再使用的log4j PropertyConfigurator重新加载配置每个节点上。



Answer 5:

您可以设置通过如下其级别设置为OFF禁用日志:

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

或编辑日志文件,并通过只是改变了以下属性设置日志级别为关:

log4j.rootCategory=OFF, console


Answer 6:

我只是这行添加到我的所有pyspark脚本顶部略低于import语句。

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

我pyspark脚本示例联箱

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


Answer 7:

以上的答案是正确的,但并没有完全帮助我,因为是我所需要的附加信息。

我刚刚建立星火所以log4j的文件仍然有“.template后缀,并没有被读取。 我相信,登录然后默认星火核心日志的conf。

所以,如果你和我一样,发现上面的答案没有帮助,那么也许你也有完美您的log4j的conf文件中删除了“.template后缀,然后上述作品!

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



Answer 8:

TL;博士

火花上下文你可以使用:

 sc.setLogLevel(<logLevel>) 

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


细节-

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

您可以直接设置日志记录级别到OFF使用:

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

您可以设置在星火壳默认的日志记录conf/log4j.properties 。 使用conf/log4j.properties.template为出发点。

在星火应用程序设置日志级别

在独立星火应用程序或在星火壳牌会议同时,使用以下命令:

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

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

禁用日志记录(在log4j的):

使用下面的conf/log4j.properties到完全禁用日志记录:

log4j.logger.org=OFF

参考:由亚采郭先生掌握的火花。



Answer 9:

在Python /星火,我们可以这样做:

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)



Answer 10:

一个有趣的想法是使用RollingAppender如下建议: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/让你不“polute”控制台空间,但仍然能够看到在$ 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


Answer 11:

下面简单PARAM添加到您的火花壳或火花提交命令

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

检查从log4j.properties文件确切的属性名(log4jspark.root.logger这里)。 希望这有助于,干杯!



Answer 12:

简单的命令行上做...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..other选项..



Answer 13:

举例收集到的所有方法

介绍

其实, 有很多方法可以做到这一点 。 有些是从别人更难,但它是由你哪一个最适合你的。 我会尽量展示它们。


#1编程方式在您的应用程序

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

例:

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配置文件 ,配置部分]


#2遍log4j.properties期间spark-submit

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

应用程序启动时的Log4J一直在寻找和加载log4j.properties从类路径文件。

然而,当使用spark-submit星火集群的类路径中优先于应用程序的类路径! 这就是为什么在你的脂肪-JAR将不会覆盖集群的设置,把这个文件!

添加-Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptions (驱动程序)
spark.executor.extraJavaOptions (对于执行器)。

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

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

上传自定义log4j.properties使用火花提交,通过将其添加到--files文件列表与应用程序被上传。

来源: 星火文档,调试

脚步:

例如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 ,如果使用client模式。 星火文档,运行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"

笔记:

  1. 文件上传到spark-cluster--files将可在根目录,所以没有必要添加任何路径file:log4j.properties
  2. 在列出的文件--files必须提供绝对路径!
  3. file:前缀配置URI是强制性的。

#3编辑集群conf/log4j.properties

这改变了全局日志配置文件

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

来源: 星火文档,调试

要找到您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覆盖配置目录

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

要指定默认值以外不同的配置目录“SPARK_HOME/conf” ,你可以设置SPARK_CONF_DIR 。 星火将使用配置文件( spark-defaults.confspark-env.shlog4j.properties从这个目录, 等等 )。

来源: 星火文档,配置

脚步:

  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" 

结论

我不知道是否有任何其他方法,但我希望这涵盖了从一个话题到Z.如果不是,请随时来ping我的意见!

享受你的路!



Answer 14:

  1. 调整CONF / log4j.properties由其他log4j.rootCategory = ERROR,控制台描述
  2. 确保在执行您的火花的工作你通过--file国旗log4j.properties文件路径
  3. 如果仍然不工作,你可能有一个具有正被新log4j.properties之前调用log4j.properties一个罐子。 取下罐子是log4j.properties(如适用)


Answer 15:

sparkContext.setLogLevel("OFF")


Answer 16:

除了上述所有的帖子,这里是解决这个问题对我来说。

星火使用SLF4J绑定到记录器。 如果log4j的是不是第一个绑定发现,你可以编辑log4j.properties文件中的所有你想要的,记录器甚至没有使用。 例如,这可能是一个可能的SLF4J输出:

SLF4J:类路径中包含多个SLF4J绑定。 SLF4J:文件:在[罐子找到绑定/ C:/Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar /组织/ SLF4J / IMPL / StaticLoggerBinder.class] SLF4J:文件:在[罐子发现结合/ 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,简单的包

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

解决了这个问题,像现在使用log4j的记录器结合在log4j.properties任何设置遵守。 FYI我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

希望这可以帮助!



Answer 17:

这一次为我工作。 对于要显示为唯一的错误消息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 ,然后继续用上面说的变化。



Answer 18:

如果你没有编辑java代码插入的能力.setLogLevel()语句,你不想还更多的外部文件来部署,您可以使用蛮力的方式来解决这个问题。 只是筛选出用grep的INFO线。

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


文章来源: How to stop INFO messages displaying on spark console?